根据变量更改节中的行数

时间:2010-08-11 15:04:18

标签: iphone objective-c cocoa-touch uitableview

在我的'Sectioned'UITableView我有两个部分,第一部分是属性,如名称,第二部分是可编辑的,您可以在其中添加对象。 这是它的图片:

alt text http://fwdr.org/bm9w

用户可以更改某个属性(在本例中为 Type ),这将更改第二部分中的行数。更具体地说,如果选择了一个属性,则最大行数为2,然后将没有添加新... 行。

这是我尝试过的(在我的UITableViewController中)......

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if ([self isToManyRelationshipSection:section]) {
        NSArray *sectionKeys = [rowKeys objectAtIndex:section];
        NSString *row0Key = [sectionKeys objectAtIndex:0];
        if ([[NSString stringWithFormat:@"%@", [managedObject valueForKey:@"type"]]
             isEqualToString:[NSString stringWithFormat:@"One on One"]] && [[managedObject valueForKey:row0Key] count] == 2){
            return [[managedObject valueForKey:row0Key] count];
        }
        return [[managedObject valueForKey:row0Key] count] +1;
    }
    return [rowLabels countOfNestedArray:section];
}

但是如果用户在已经有2行的情况下尝试删除行,则应用程序崩溃,因为在删除之前和之后会有相同的行数。

如何解决此问题并正确执行此操作?

2 个答案:

答案 0 :(得分:0)

首先,我认为numberOfRows ..方法不适合做这种逻辑。我宁愿创建一个单独的方法来确定并返回当前的游戏模式(并在用户选择其他模式时保持游戏模式更新)。我将整数与游戏模式联系起来(1 =“一对一”,2 =“全部反对所有”......),在numberOfRows方法中你需要检查“当前部分== 1?” &安培;&安培; “我们在哪种游戏模式?”确定需要多少行。

如果你正确地跟踪游戏模式,你也不需要再检查相同的字符串了。

答案 1 :(得分:0)

我的结果与我最初想做的不同。

我的理由是我当前的实现在调试器中给了我一个错误,这反过来又崩溃了应用程序。这个错误似乎是不可避免的,所以我决定简单地禁用单元格,如果有两行,而不是隐藏它。

要在我的tableView:cellForRowAtIndexPath:方法中执行此操作,我添加了以下代码(在我的if语句中),使其对用户来说无法选择:

cell.textLabel.textColor = [UIColor lightGrayColor];
cell.editingAccessoryType = UITableViewCellAccessoryNone;

tableView:didSelectRowAtIndexPath:方法中,我将if语句留空,因此不会推送另一个视图控制器或添加对象。虽然我确实包含了这段代码来取消选择行:

[self.tableView deselectRowAtIndexPath:indexPath animated:NO];