2012-09-20 21 views
0

我有一個UITableView子類,有時需要提供自己的內部實現來計算段的數量。因此,有時我需要從數據源中獲取部分數量,有時我需要忽略數據源併爲自己計算。在UITableView的子類中重寫UITableViewDatasource

我試圖重寫的UITableView的numberOfRowsInSection:(注意:這是表視圖的這個版本,而不是數據源的的tableView:numberOfRowsInSection :)像這樣的東西:

- (NSInteger)numberOfRowsInSection:(NSInteger)section 
    { 
    NSInteger numberOfRows = 0 ; 
    if(![self sectionIsCollapsed:section]) // is the section expanded? 
     { 
     numberOfRows = [super numberOfRowsInSection:section] ; 
     } 
    return numberOfRows ; 
    } 

然而,UITableView中的-endUpdate實際上並不調用這個方法,但直接進入數據源。有沒有辦法覆蓋對數據源的調用,或者我只是SOL?

謝謝!

+0

爲什麼你不能在dataSource中做到這一點? – onnoweb

+0

因爲這是一個框架類;表視圖數據源屬於該類的用戶。 – leftspin

+0

也許我會問很難的問題。 – leftspin

回答

0

您的問題與我正在處理的某些內容有關。
如果我理解正確,您想在自定義UITableView實現中重寫UITableviewDataSource的某些方法,而不是其他方法。

在你的情況,你要求UITableView是它自己的數據源。也許你可以在適當的時候在你的嵌入式數據源和「真正」的數據源之間來回切換?

tableview,數據源和委託之間沒有繼承關係。 tableview只是指向另外兩個。我可以看到這個工作的唯一方式是如果你在你的tableview中實現了完整的UITableviewDataSource協議(坦白地說,這個協議味道不好),然後將代理指針四處亂洗,這似乎有風險。

我認爲一個更清潔,低風險的方式是創建一個一個符合UITableviewDataSource協議,這需要一個例如現有UITableviewDataSource作爲初始化參數的框架,用戶,幷包裝一路在你需要它的行爲時通過和/或修改它的呼叫,當你不需要時保持它在黑暗中。 然後你使用你的包裝類(es)作爲桌面視圖上的代表。

您認爲如何?

我不記得這個設計模式的名稱,所以我將它稱爲矩陣模式。客戶的數據源/代理處於黑暗中,在一個盒子裏,並不知道它不在「真實」世界中。

我懷疑你需要爲UITableviewDataSource和UITableViewDelegate實現類以使其順利工作。

0

我已經在自己的項目中實現了上述方案,並且運行良好。我已經將委託和數據源完全包裝在一個包裝對象中,該對象使用現有的委託和數據源進行初始化。 然後我操縱通過我的包裝對象流入和流出的數據。

相關問題