2013-05-08 3 views
1

Я обновляю мой UITableView со следующим кодом:методы UITableViewDataSource не вызывался

int index = [self.guests indexOfObject:_guests]; 

[[self tableView] beginUpdates]; 
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationLeft]; 
[[self tableView] endUpdates]; 

Но после вызова [[self tableView] endUpdates], его не вызывая его методы DataSource. В случае добавления строки он вызывает свои методы источника данных. Я думаю, что в случае удаления ему не нужно ничего спрашивать с его источником данных, но в случае добавления строки ему нужно спросить свой источник данных о почти все о новой строке, добавленной как cellForRow, высоте и т. Д. И т. Д. Я просто хочу убедитесь, что это правильно, если deleteRowsAtIndexPaths не вызывает какие-либо методы его источника данных?

+0

У вас есть все видимые ящики одновременно? –

+0

вам нужно будет вызвать '[tableView reloadData];' after endUpdates –

+0

без reloadata, tableView не вызовет его методы делегирования? @AhmedZ. –

ответ

2

deleteRowsAtIndexPaths:indexPaths не вызывает методы делегатов во всех ситуациях. Он просто удаляет строки. Если удаляемые строки настолько велики, что они занимают область экрана, тогда он может вызвать ваш метод делегирования. Вы должны явно вызвать reloadData, чтобы он обновлял свои строки.

Но вызов reloadData сразу испортит вашу анимацию или произведет странные ошибки, поскольку ее строки удаляются, и вы вызываете метод перезагрузки. (может сойти с ума). Альтернативное решение состоит в вызове reloadData после небольшой задержки, как 0,2 или больше, как это:

[self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationLeft]; 
[self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.2]; //calling reloadData after a short delay. 0.2 or whatever suits you. 

Не забывайте об удалении данных из массива вашего DataSource или все, что вы используете для хранения данных.

+0

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

+1

Нет, ничего не случилось. Его правильное поведение. [Здесь] (http://stackoverflow.com/a/861250/593709) другой связанный пост. –

+0

Не было бы лучшим решением вызывать 'reloadRowsAtIndexPaths:' внутри того же самого блока beginUpdates', что и delete вместо того, чтобы возиться с факторами задержки и т. Д.? – jszumski

0

Ответ на вопрос: «Почему он должен вызывать все методы источника данных и делегирования, если представление уже попущено и все ячейки доступны»? хорошо это Должно ли поведению

Смежные вопросы