Подкласс UITableViewController реализует протокол UIDataSourceModelAssociation, но его методы никогда не вызываются

В моем приложении используется CoreDataTableViewController из Стэнфордского курса, который является подклассом UITableViewController.

Для определенных представлений моего приложения я создаю подклассы CoreDataTableViewController для управления определенным представлением.

Я только недавно подключил кодирование состояния и восстановление в большей части своего приложения, и все, кажется, работает нормально. Единственное, что я оставил поздно, — это реализация протокола UIDataSourceModelAssociation для якобы сохранения видимых и выбранных строк UITableViews (я также надеялся, что он может сохранить состояние редактирования табличного представления и конкретной строки, если я выбрал ее для удалить, но еще не подтвердил).

Я реализовал UIDataSourceModelAssociation в CoreDataTableViewController, надеясь, что он будет работать для всех моих представлений, но при отладке функция не работает, и добавление точек останова я вижу, что ни один из двух методов UIDataSourceModelAssociation никогда не вызывается, когда я помещаю свое приложение в фон с помощью кнопки «Домой» или восстановить его, повторно запустив в XCode.

CoreDataTableViewController и его подклассы реализуют некоторые методы dataSource для фактического отображения строк в представлении таблицы. Я искал и обнаружил, что UITableViewController автоматически добавляет себя в качестве источника данных для tableView.

Я добавил в свои подклассы функции viewDidLoad проверки здравомыслия вида

assert(self.tableView);
assert(self.tableView.dataSource == self); <--- fails here

Который терпит неудачу при проверке источника данных, являющегося собой. Я вижу, регистрируя и используя отладчик, что на данный момент источник данных не равен нулю.

Я думаю, мне просто интересно, когда мы подклассифицируем класс, каждый класс имеет одно и то же значение self, или это потому, что мой UITableViewController установил себя как источник данных, но к тому времени, когда я дважды подклассировал его до моего конкретного экземпляра представления он немного отличается от родительского UITableViewController. Или что-то еще перехватывает источник данных и пересылает по мере необходимости. В качестве исправления я должен рассмотреть возможность жесткого кодирования собственного подкласса для себя или позволить CoreDataTableViewController явно добавить себя в качестве источника данных, поскольку именно здесь реализованы методы UIDataSourceModelAssociation.

Для справки, моя иерархия представлений состоит из представлений подкласса UITableViewController, находящихся внутри NavigationControllers, которые, как я слышал, могут вызывать проблемы.

Просто немного ясности в том, как подклассы должны работать в отношении указателей на себя в классах, и интересно, может ли кто-нибудь понять, почему мои методы протокола не вызываются, было бы очень ценно.

Ваше здоровье


person jimbobuk    schedule 15.09.2014    source источник


Ответы (1)


Я до сих пор не уверен, почему источник данных моего tableViewController не установлен непосредственно на себя. Но ясно, что мои методы dataSource вызываются как мои функции tableView. Очевидно, что какой-то объект перенаправляет методы dataSource в мой фактический класс для меня...

В конце концов, вызвать методы протокола UIDataSourceModelAssociation было так же просто, как убедиться, что и UITableViewController, и UITableView внутри него имеют идентификаторы восстановления.. только внешний UITableViewController имеет идентификатор восстановления, ни один из этих методов не вызывается.

К сожалению, теперь эти методы вызываются до того, как мой UIManagedDocument закончит загрузку, поэтому я не могу сделать в них ничего полезного. Это еще одна проблема.

person jimbobuk    schedule 16.09.2014
comment
Спасибо за ваш вклад, я тоже столкнулся с этим поведением. Убедившись, что подкласс UITableViewController имеет свойство dataSource, явно установленное в self (или что-то еще), вызывается метод UIDataSourceModelAssociation. - person Lorenzo Bevilacqua; 06.07.2016