Метод делегата UITableView вызывается дважды - PullRequest
14 голосов
/ 14 апреля 2010

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

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

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

Ответы [ 4 ]

12 голосов
/ 13 февраля 2011

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

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

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

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

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

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

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

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

2 голосов
/ 14 февраля 2013

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

[parentViewController addChildViewController:childViewController];

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

0 голосов
/ 21 декабря 2014

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

0 голосов
/ 14 февраля 2013

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

...