修改cellForRowAtIndexPath外部的静态单元格而不创建新单元格

时间:2012-08-04 03:59:48

标签: iphone ios uitableview

所以我得到它通常不赞成修改cellForRowAtIndexPath之外的单元格,但这就是我所拥有的:

我有一个静态表,用作问题索引(1-33)。每行都有一个问题和一个详细的披露指标。所有这些都是在stoyboard上手动输入的。

我有一个文件列出了每个问题和一些属性,例如问题是否已被回答 加载此屏幕时(viewDidAppear)我想检查是否已加载这些问题,如果是,请将详细指示符切换为复选标记。

现在这适用于前5个单元格。如果我回答问题并回来,那么检查更多的单元格(即使问题没有得到解答)。这是未定义的行为,因为我在cellForRowAtIndexPath之外访问它?

以下是我用来访问和更改单元格的代码:

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (question1Answered)
    { 
        UITableViewCell *cell1 = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:3]];
        [cell1 setAccessoryType:UITableViewCellAccessoryCheckmark];
    }
}

同样,它确实适用于前5个元素,然后其余部分不会改变,无论我做什么。然后,如果我转到一个问题然后返回它会显示更多选择它。奇怪的行为......

编辑:我刚才注意到上面的代码有效,但它只更新当前屏幕上的单元格。因此,如果我向下滚动,离开并返回所有可见单元格将具有复选标记。有没有办法强制刷新所有单元格,即使它们不可见?

感谢您的帮助......

-David

3 个答案:

答案 0 :(得分:0)

您不应该从viewDidAppear更新单元格。

相反,您应该从viewDidApeear重新加载数据。

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (question1Answered)
    {             
        //This will call your tableview's delegate for visible cells
        [self.tableView reloadData];
    }
}

在cellForRowAtIndexPath中,你应该决定分配配件类型。

答案 1 :(得分:0)

这与我几天前回答的另一个问题类似。见stackoverflow.com/a/11770387/1479411

使用委托方法。从其他视图控制器返回后,将任何修改单元格内容的代码和[self.tableView reloadData]放在委托方法中。

答案 2 :(得分:0)

首先应该更新您的模型,然后根据模型状态更新您的UI 例如,如果您的模型是Question对象的数组,并且每个问题都有一些hasBeenAnswered布尔值。
那么你应该在viewDidAppear中做的唯一事情是调用[self.tableView reloadData],这将更新你的表视图,因为将调用cellForRowAtIndexPath并根据你的模型状态设置单元格。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil) { 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // configure the cell according to your model state  
    Question *question = [self.questions objectAtIndex:indexPath.row];  

    // check if this question has been answered
    if (question.hasBeenAnswered) {
       // if yes - set a checkmark
       [cell setAccessoryType:UITableViewCellAccessoryCheckmark];  
    }
    else {
       // if not - set to none (or whatever u want)
       [cell setAccessoryType:UITableViewCellAccessoryNone];
    }

    return cell;
}