Как удалить строку в TTTableViewController (Three20) - PullRequest
2 голосов
/ 06 декабря 2009

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:]: index (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];

Я читал эту статью ( статья ), но это не помогает: (

Итак, я знаю, что это очень просто для гуру с этого сайта. Можете ли вы дать мне расширенный образец, как это сделать

Спасибо

Ответы [ 2 ]

4 голосов
/ 08 марта 2010

Я также получил «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 удаляет раздел вместо ячейки.

НТН

1 голос
/ 06 декабря 2009

Первое, что я заметил, это то, что вы удаляете строку из таблицы, когда таблица не находится в режиме редактирования.

...