所以我得到它通常不赞成修改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
答案 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;
}