1

我对 iPhone 编程很陌生,所以我的问题可能是由于完全缺乏对基本原理的了解造成的。

我正在开发一个有两个视图的 iPhone 应用程序。第一个视图有两个按钮,当按下其中一个按钮时,会弹出一个带有表格视图的模态视图。根据按下的按钮,此表视图的填充方式不同。如果按下按钮 button1,则 tableview 将填充 button1Data。用户可以选择单元格,如果这样做,则单元格附件类型设置为 UITableViewCellAccessoryCheckmark。然后我将检查的单元格的名称保存到 tableViewListChecked 中,以便以后可以决定在数据更改时应该检查哪个单元格。

问题如下:关闭modalview后,我选择button2在button1Data中选择的单元格仍然在button2Data中选择。我很清楚 [theTableView reloadData] 函数正在工作,因为数据确实发生了变化,但是在我将单元格从屏幕上滚动之前,附件仍然是相同的。

PS如果我确实滚动屏幕的单元格,那么附件类型设置正确。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    }

    else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    cell.textLabel.text = [tableViewList objectAtIndex:indexPath.row];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    if (![tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [tableViewListChecked addObject:[NSString stringWithString:cell.textLabel.text]];       
    }

    else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [tableViewListChecked removeObject:[NSString stringWithString:cell.textLabel.text]];
    }   
}

谢谢你的帮助!

4

3 回答 3

1

如果单元格不为零(如果它已从表格视图中出列),那么您实际上并没有更改附件类型。放弃else,即改变

else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
}

if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
}
于 2011-10-10T19:53:11.593 回答
0

听起来您UITableView每次呈现模态视图时都在重用相同的实例,在这种情况下,tableViewListChecked数组发生了什么?您正在换出tableViewList;中的数据 但是您是否采用了一些策略来在按钮 1 和按钮 2 上的点击之间保留已检查项目的列表?

于 2011-10-10T19:53:55.230 回答
0

如果这里的人没有帮助你,你可以设置: cell.accessoryType = UITableViewCellAccessoryNone 每次用户点击button2

于 2011-10-11T02:16:48.887 回答