0

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

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

我有一个文件,其中列出了每个问题和一些属性,例如问题是否已被回答。
当此屏幕加载(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 个元素,然后无论我做什么,其余的都不会改变。然后,如果我去一个问题并返回它会显示更多选择它。奇怪的行为...

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

感谢您的任何帮助...

-大卫

4

3 回答 3

0

这类似于我几天前回答的另一个问题。请参阅stackoverflow.com/a/11770387/1479411

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

于 2012-08-05T08:51:55.727 回答
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 中,您应该决定分配附件类型。

于 2012-08-04T04:48:10.290 回答
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;
}
于 2012-08-05T09:32:56.107 回答