commitEditingStyle与分组表问题

时间:2011-05-10 01:49:27

标签: ios uitableview

我很难绕过这个。我正在从plist文件中加载一个NSMutable数组,并用数据填充一个分组表。该表有3个部分,第0部分不可编辑,但另外两个是 - 我有限制工作。我的问题是当用户选择删除两个可编辑部分中的行时。我相信这是因为每个条目都有两个键 - 一个用于它的名字,另一个用于它的URL。

这是我的plist的样本。标题键用于节名称。然后是“行”的键 - 这是在每个单元格中显示的文本,然后是“url”,当选择行时,将在网页视图中加载网址。我知道我想抓取用户选择的部分和行,然后删除该索引的'Row'和'url'。任何帮助将不胜感激。

这是我的plist:

<array>
<dict>
<key>Title</key>
<string>Query</string>
    <key>Rows</key>
    <array>
        <string>Non-editable String 1</string>
        <string>Non-editable String 2</string>
        <string>Non-editable String 3</string>
        <string>Non-editable String 4</string>
    </array>
</dict>
<dict>
    <key>Title</key>
    <string>Resources</string>
    <key>Rows</key>
    <array>
        <string>Website Name 1</string>
        <string>Website Name 2</string>
        <string>Website Name 3</string>
        <string>Website Name 4</string>
        <string>Website Name 5</string>
    </array>
    <key>url</key>
    <array>
        <string>http://website1.com</string>
        <string>http://website2.com</string>
        <string>http://website3.com</string>
        <string>http://website4.com</string>
        <string>http://website5.com</string>
    </array>
</dict>
<dict>
    <key>Title</key>
    <string>Monitoring</string>
    <key>Rows</key>
    <array>
        <string>Website Name 6</string>
        <string>Website Name 7</string>
        <string>Website Name 8</string>
    </array>
    <key>url</key>
    <array>
        <string>http://website6.com</string>
        <string>http://website7.com</string>
        <string>http://website8.com</string>
    </array>
</dict>

这限制了编辑到最后两个部分

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView     editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0)
    return UITableViewCellEditingStyleNone;
else
    return UITableViewCellEditingStyleDelete;
}

这是用于提交删除的(非工作代码)(tableData是我的可变数组的名称)。我的应用程序炸弹:

        [[self.tableData objectAtIndex:indexPath.section] removeObjectAtIndex:indexPath.row];

但是猜测deleteRowsAtIndexPaths也是错误的。 代码:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {

    [self.tableView beginUpdates];
    [[self.tableData objectAtIndex:indexPath.section] removeObjectAtIndex:indexPath.row];

    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath.row] withRowAnimation:UITableViewRowAnimationFade];

    [self.tableView endUpdates];
    [self.tableView reloadData];
}



--- --- UPDATE 如果我这样做并将section和row设置为NSUInteger,当我记录它时,会记录正确的section和row。但是,我正在崩溃

[[self.tableData objectAtIndex:section] removeObjectAtIndex:row];

在我的控制台中,我收到此错误:由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSCFDictionary removeObjectAtIndex:]:无法识别的选择器发送到实例0x4b43b20'

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {

    NSUInteger row = [indexPath row];
    NSLog(@"NSUInteger Row: %d", row);

    NSUInteger section = [indexPath section];
    NSLog(@"NSUInteger Section: %d", section);

    [self.tableView beginUpdates];

    [[self.tableData objectAtIndex:section] removeObjectAtIndex:row];

    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:row inSection:section]] withRowAnimation:UITableViewRowAnimationFade];

1 个答案:

答案 0 :(得分:1)

对于你的plist,tableData变量是一个NSMutableArray,其中包含3个对象,每个对象都是NSMutableDictionary(尽管事件是docs say it should be an NSDictionary--immutable)。

第二个和第三个词典包含三个键:Title,Rows和url

Rows和url键的值是NSMutableArrays(尽管文档说它们应该是NSArrays - 不可变)。

无论如何,在阅读plist之后,您想要修改的对象必须以默认的方式或明确地调用mutableCopy来改变。

commitEditingStyle方法中,您需要在数组上调用removeObjectAtIndex而不是部分字典。因此,首先获取对Rows和url数组的引用(您必须在cellForRowAtIndexPath中执行类似操作才能显示值)。

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    {
        NSMutableDictionary *sectionDict = [tableData objectAtIndex:indexPath.section];
        NSMutableArray *sectionRows = [sectionDict objectForKey:@"Rows"];
        NSMutableArray *sectionUrls = [sectionDict objectForKey:@"url"];

        [sectionRows removeObjectAtIndex:indexPath.row];
        [sectionUrls removeObjectAtIndex:indexPath.row];

        //don't need beginUpdates (we're making only one delete call)           
        //tableView beginUpdates];

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
                withRowAnimation:UITableViewRowAnimationFade];

        //don't need endUpdates (since we're not doing beginUpdates)
        //[tableView endUpdates];

        //don't need reloadData since we're calling deleteRowsAtIndexPaths
        //(or call reloadData instead of deleteRowsAtIndexPaths)
        //[tableView reloadData];
    }
}