想象一下,一個表格視圖控制器ExtraRowTableViewController
,Swift,「子類」UITableView的數據源方法莫名其妙?
它總是插入一個額外的行後,(比方說)第三行。
在這個例子中所以......
class SomeList:ExtraRowTableViewController
override func numberOfSectionsInTableView(tableView: UITableView)->Int
{
return yourData.count ... say, 50 items
}
override func tableView
(tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath)
-> UITableViewCell
{
return yourData.cell ... for that row number
}
ExtraRowTableViewController
將「接管」,並實際上將返回51
有關的cellForRowAtIndexPath,它會「接管」,並在四排回到了自己的細胞,它會將您的單元格行N從0返回到3,並且它將返回您的單元格行減4以上的行。
這怎麼能在ExtraRowTableViewController
中實現?
因此,SomeList的程序員根本不需要改變。
你會繼承UITableView,或數據源委託..或?
爲了澄清,一個例子使用情況而定,我們說,加入廣告,編輯字段,或者一些特殊的新聞,在第四排。 SomeList的程序員需要完全不做任何事情來達到這個目的是合適的,即它是以完全OO的方式實現的。
請注意,這是當然的,容易只需添加新的「替代品」的呼叫,你的表視圖將「只知道」來使用,而不是正常的呼叫。 (RMenke具有下面提供的這一個有用的完整的例子。)所以,
class SpecialTableViewController:UITableViewController
func tableView(tableView: UITableView, specialNumberOfRowsInSection section: Int) -> Int
{
print ("You forgot to supply an override for specialNumberOfRowsInSection")
}
func tableView
(tableView:UITableView, specialCellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell
{
print ("You forgot to supply an override for specialCellForRowAtIndexPath")
}
override final func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return self.specialNumberOfRowsInSection(section) + 1
}
override final func tableView
(tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell
{
if indexPath.row == 4
{ return ... the special advertisement cell ... }
if indexPath.row < 4
{ return self.specialCellForRowAtIndexPath(indexPath)
if indexPath.row > 4
{ return self.specialCellForRowAtIndexPath([indexPath.row - 1])
}
在您的表視圖程序員必須「只知道」,他們必須在SpecialTableViewController使用specialNumberOfRowsInSection和specialCellForRowAtIndexPath而不是通常的呼叫的例子...這不是一個乾淨的,簡單的面向對象解決方案。
注:我很欣賞你也可能以某種方式覆蓋信號NSObject的子類(如討論here),而不是一種語言的解決方案。
你基本上提出有新的功能,和人民書寫IATableViewController的子類必須知道使用這些新功能,而不是通常的? – Fattie
@JoeBlow對第二部分是肯定的。不幸的是,默認函數來自的TableViewDataSource是一個協議,我們不能將存儲的屬性添加到協議中。這意味着我們無法爲行/節號添加翻譯器/適配器。你需要那樣的東西。否則,您從中獲得的indexPath,例如選擇一行將不再匹配您的數據。看看github。這比現在看起來簡單得多,因爲你只是覆蓋了新的功能。其他一切都是隱藏的。 –
@JoeBlow回答第一條評論。無論你在任何地方添加多少行/部分,你總會需要一個翻譯器(如上所述)。顯然你可以改變上面的代碼,只在最後或「4」處添加一行。 –