Как удалить строку в TTTableViewController (Three20)
Вопрос
Three20 — отличная библиотека.Это значительно упрощает работу с таблицами.Но один пробел, который я заметил - это удаление строк с анимацией.Я потратил много часов, пытаясь это сделать, и вот что я делаю:
// get current index patch
UITableView* table = [super tableView];
NSIndexPath *indexPath = [table indexPathForSelectedRow];
//delete row in data source
TTListDataSource * source = (TTListDataSource *)self.dataSource;
[source.items removeObjectAtIndex:indexPath.row];
// delete row from the table, with animation
[table deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
После запуска этого кода появляется ошибка:[NSCFArray objectAtIndex:]:индекс (0) за пределами (0)
Я использую класс, унаследованный от TTTableViewController.И я не реализую DataSourceDelegate или TableViewDelegate, потому что максимально использую Three20.Итак, вот как я создаю источник данных:
for(NSDictionary *album in (NSArray *)albums){
TTTableRightImageItem *item = [TTTableRightImageItem itemWithText:@"name"
imageURL:@"image url"
defaultImage:nil
imageStyle:TTSTYLE(rounded)
URL:@"url of selector where I actually catch the tap on a row"];
[tableItems addObject:item];
}
self.dataSource = [TTListDataSource dataSourceWithItems:tableItems];
Я прочитал эту статью(статья), но это не помогает :(
Итак, я знаю, что для гуру с этого сайта это очень просто.Можете ли вы просто дать мне расширенный пример того, как это сделать?
Спасибо
Решение
Первое, что я заметил, это то, что вы удаляете строку из таблицы, когда таблица не находится в режиме редактирования.
Другие советы
Я также получил «EXC_BAD_ACCESS» в model:didDeleteObject:atIndexPath:
но я решил эту проблему.
Чтобы удалить строку в TTTableViewController, вам необходимо реализовать tableView:commitEditingStyle:
в вашей реализации DataSource следующим образом:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { id object = [[self.items objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; [self.model didDeleteObject:object atIndexPath:indexPath]; } }
Вам также необходимо реализовать tableView:willRemoveObject:atIndexPath:
в вашем источнике данных:
- (NSIndexPath*) tableView:(UITableView *)tableView willRemoveObject:(id)object atIndexPath:(NSIndexPath *)indexPath { // delete the object [object deleteFromDB]; // removeItemAtIndexPath returns YES if the section is removed if ([self removeItemAtIndexPath:indexPath andSectionIfEmpty:YES]) { // remove an index path only to that section return [NSIndexPath indexPathWithIndex:indexPath.section]; } else { return indexPath; } }
Хитрость заключается в том, чтобы изменить NSIndexPath
вы возвращаетесь только к тому, чтобы содержать раздел, который становится пустым.Затем код в TTTableViewController удаляет раздел вместо ячейки.
ХТХ