如何删除表视图控制器中的行(Three20)

时间:2009-12-06 13:53:40

标签: iphone three20

The 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)超出bounds(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];

我读过这篇文章(article),但没有帮助:(

所以,我知道这对于这个网站的大师来说非常简单。你能给我一些如何做的高级样本

由于

2 个答案:

答案 0 :(得分:4)

我在model:didDeleteObject:atIndexPath:中也得到了“EXC_BAD_ACCESS”,但我解决了这个问题。

要删除TTTableViewController中的行,您需要在DataSource实现中实现tableView:commitEditingStyle:,如下所示:

- (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];
    }
}

您还需要在DataSource中实现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中的代码删除该部分而不是单元格。

HTH

答案 1 :(得分:1)

我发现的第一件事是,当表未处于编辑模式时,您正在从表中删除一行。