Представьте себе настольный контроллер 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, и она вернет вашу строку ячейки минус один для строк выше четырех.
Как это можно достичь в 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])
}
В примере ваша таблица вид программист должен был бы «просто знать», что они должны использовать specialNumberOfRowsInSection и specialCellForRowAtIndexPath в SpecialTableViewController, а не обычные звонки ... это не чистое решение для ввода-вывода.
Примечание: Я понимаю, вероятно, можно создать подкласс NSObject каким-то образом, чтобы переопределить сигналы (например, как описано here), но это не является языком решение.
Вы в основном предлагают, что есть новые функции, и люди, пишущие подклассы IATableViewController бы знать, чтобы использовать эти новые функции вместо обычных? – Fattie
@ JoeBlow да ко второй части. К сожалению, TableViewDataSource, откуда поступают функции по умолчанию, является протоколом, и мы не можем добавлять хранимые свойства в протоколы. Это означает, что мы не можем добавить переводчик/адаптер для номеров строк/секций. Тебе нужно что-то подобное. Еще один элемент indexPath, который вы получаете, например, выбор строки больше не будет соответствовать вашим данным. Проверьте github. Это намного проще, чем может показаться сейчас, потому что вы только переопределяете новые функции. Все остальное скрыто. –
@JoeBlow ответить на первый комментарий. Независимо от того, сколько строк/разделов вы добавляете в любом месте, вам всегда понадобится переводчик (как указано выше). Очевидно, вы можете изменить приведенный выше код, чтобы добавить только одну дополнительную строку в конце или в «4». –