Вызов метода делегата UITableView дважды

Сегодня мой вопрос о UITableViewController-s В частности, я заметил, что метод делегата datasource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

вызывается дважды (даже если, например, я просто создаю приложение на основе навигации и не добавляю строку кода. Хорошо добавляя NSLog для ее отслеживания). Теперь, поскольку в моем приложении мне нужно определить количество разделов, основанных на выборе в документах в файловой системе, мне нужно вызвать некоторые методы для этого. Я поместил эти методы в вышеупомянутый метод, поэтому они будут вызываться дважды, что мне не нужно. Вопросы в том, почему он называется дважды, я могу его вызвать один раз? Надеюсь, что в официальной документации это четко не указано (что означало бы, что я его совсем не читал:)). Кстати, я видел, как другие публиковали подобные вопросы, но я не мог найти полностью удовлетворительный ответ. Спасибо.

Ответ 1

У меня была та же проблема, только с вызовом numberOfRowsInSection: Ответ ответил на трассировку стека за каждый полученный звонок.

  • Первый вызов произошел из-за изменения в представлении заголовка таблицы, которое я делал в viewDidLoad: моего диспетчера представлений.

    thumbView.tableHeaderView = nil;
    thumbView.tableFooterView = nil;
    

    Это привело к внутреннему вызову _updateContentSize:, который вызвал heightForTable:, который в итоге назвал numberOfRowsInSection:. Это было что-то, что я вызвал, и его можно было легко избежать, не выполняя приведенный выше код:)

  • Второй вызов был законным, чтобы перезагрузить Data. Это вызвано событием компоновки где-то и, скорее всего, вы не можете пропустить его.

Я уверен, что вы можете наблюдать что-то подобное для метода numberOfSections:

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

Надеюсь, что это поможет

Ответ 2

Если ваше табличное представление содержится в контроллере дочернего представления, Попробуйте это в своем родительском ViewController

[parentViewController addChildViewController:childViewController];

до [parentViewController.view addSubview:childViewController.view]

Ответ 3

Пожалуйста, проверьте свой код, после добавления TableView вы снова можете вызвать метод realodData таблицы в методе be ViewWillAppear

Ответ 4

Это может произойти, если ваш ракурс просмотра таблицы будет изменен по ошибке на панели рассказов. Скажем, вы нажали на раскадровку, в которой вы добавили представление таблицы в качестве подсмотра, и теперь ваша таблица может не иметь надлежащего кадра, вы установили в начале.