reloadData вызывает numberOfSections, numberOfRows, а не cellForRowAtIndexPath - PullRequest
5 голосов
/ 16 февраля 2012

Прежде всего, извините, если это не отформатировано правильно, в первый раз, делая это. Я давно использую stackoverflow, чтобы найти помощь, и она мне очень помогла (спасибо всем), но я впервые опубликовал свой вопрос. Этот вопрос задавался много раз, но когда я вызываю [myTable reloadTable], вызываются методы numberOfSectionsInTableView и numberOfRowsInSection, но не cellForRowAtIndexPath.

Каждый ответ, который я видел при поиске, был вариацией: 1) TableView это ноль 2) numberOfRowsInSection равно 0 3) делегат / источник данных tableView не задан 4) вызов reloadTable для неверного uiTableView.

Ничто из этого не относится ко мне, поэтому мне интересно, что еще может быть не так.

Что я пытаюсь сделать: У меня есть пользовательский uitableviewcell с кнопкой на нем, когда кнопка нажата, я хочу изменить атрибуты ячейки (например, скажем, я хочу изменить название ячейки на «Button Pressed»). Затем я хочу на минуту остановиться, а затем удалить ячейку.

Не уверен, что это важно, но мой tableView находится внутри UIViewController, а viewController - это делегат и источник данных.

У меня есть метод (ниже), который срабатывает при нажатии кнопки, и атрибуты ячейки меняются по мере необходимости, однако, когда я пытаюсь обновить таблицу, чтобы показать изменения, она не работает. При первом вызове [remTable reloadData] вызываются numberofsectionsintableview и numberofrowsinsection, но не cellforrowatindexpath. Однако при втором вызове [remTable reloadData] все три метода вызываются, и все работает правильно.

doneCell.remName.text=@"BUTTON PRESSED";
[remTable reloadData];
NSLog(@"sleep");
sleep(1);
[remList removeObject:doneReminder];
[remTable reloadData];

Чтобы проверить это, я поместил операторы nslog в начале numberofsections, numberofrows и cellforrow, вывод - это имя метода, за которым следует число (для numberofsections / numberofrows).

Выход:

numberofsections 1
numberofrows 3
sleep
numberofsections 1
numberofrows 2
cellforrow

Есть какие-нибудь идеи относительно того, почему cellforrow не вызывают в первый раз? Заранее спасибо, пожалуйста, дайте мне знать, если есть что-то еще, что я могу добавить, чтобы уточнить.

Ответы [ 3 ]

8 голосов
/ 16 февраля 2012

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

Выполнение не возвращается в цикл выполнения, пока не вернется ваш код. Когда вы звоните sleep, вы не выполняете никакого кода, но также не возвращаете. Это означает, что цикл выполнения не имеет возможности отобразить таблицу, поэтому он никогда не запрашивает ячейки. Вам нужно вернуться из вашего метода и попросить, чтобы через 1 секунду был вызван другой метод для удаления doneReminder. Самый простой способ сделать это - использовать метод performSelector:withObject:afterDelay:. Этот метод добавляет таймер, который будет вызывать метод, который вы запросили после заданной задержки, что означает, что вы можете вернуться в цикл выполнения и позволить отображению таблицы.

doneCell.remName.text=@"BUTTON PRESSED";
[remTable reloadData];
[self performSelector:@selector(removeDoneReminder) withObject:nil afterDelay:1.0];
- (void)removeDoneReminder {
    [remList removeObject:doneReminder];
    [remTable reloadData];
}

Если remlist и remTable не являются переменными экземпляра, вы можете использовать параметр withObject: для отправки их в метод removeDoneReminder.

0 голосов
/ 16 февраля 2012

Попробуйте использовать замедленную производительность:

[remtable performSelector:@selector(reloadData) withObject:nil afterDelay:0.1];

Не знаю, поможет ли это, потому что я не знаю, что еще вы делаете.

0 голосов
/ 16 февраля 2012

CellForRowAtIndexPath является частью протокола источника данных UITableView, убедитесь, что remtable.datasource указывает на self

, поэтому при инициализации TableView необходимо всегда добавлять

remtable.datasource = self; 

iсделал это, после

remtable.delegate = self;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...