【发布时间】:2011-02-08 19:22:01
【问题描述】:
代码已更新到工作版本。再次感谢您的帮助:)
大家好。我有一个 UITableViewController 设置为使用从笔尖加载的自定义单元格。这是我的 cellForRowAtIndexPath:
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellIdentifier = @"PeopleFilterTableViewCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"PeopleFilterTableViewCell" owner:self options:nil];
cell = peopleFilterTableViewCell;
self.peopleFilterTableViewCell = nil;
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
PeopleFilterTableViewCell* tableViewCell = (PeopleFilterTableViewCell *) cell;
/* Set direct button name */
Person* personAtRow = [directsToShow objectAtIndex:indexPath.row];
[tableViewCell.directButton setTitle:personAtRow.name forState:UIControlStateNormal];
/* Set direct head count */
tableViewCell.headcountLabel.text = [NSString stringWithFormat:@"%d", personAtRow.totalHeadCount];
UIImage* unselectedImage = [UIImage imageNamed:@"filterButton.png"];
UIImage* selectedImage = [UIImage imageNamed:@"filterButtonClosed.png"];
UIButton* newFilterButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
/* Set filter button image */
if(personAtRow.filtered){
[newFilterButton setSelected:YES];
} else {
[newFilterButton setSelected:NO];
}
tableViewCell.filterButton = newFilterButton;
return cell;
}
这对我来说似乎工作得很好,但是在 /* 设置过滤器按钮图像 */ 注释之后的代码出现了一个问题。
过滤器按钮是我的自定义单元格 nib 中的 UIButton,它应该反映包含“Person”对象的模型数组的状态,这些对象具有一个可以切换以表示它们是否被过滤的字段。
我允许用户更新此模型对象的方式是通过我的顶级控制器上的自定义委托方法,每当用户单击过滤器按钮时,更新模型和按钮的状态,并另外更新一个 mapViewController,根据模型的状态显示一些数据:
- (void)updateViews:(id)sender {
UIImage* unselectedImage = [UIImage imageNamed:@"filterButton.png"];
UIImage* selectedImage = [UIImage imageNamed:@"filterButtonClosed.png"];
int row = [self rowOfCellSubView:sender];
Person* personToFilter = [self.directsToBeShown objectAtIndex:row];
NSLog(@"Filtering person with corpId: %@, name: %@", personToFilter.corpId, personToFilter.name);
if (personToFilter.filtered){
//update button image
[sender setImage:unselectedImage forState:UIControlStateNormal];
[sender setSelected:NO];
//add person back.
Person* directFiltered = [self.directsToBeShown objectAtIndex:row];
directFiltered.filtered = NO;
NSLog(@"Filtering person with corpId: %@, name: %@, filtered: %d", directFiltered.corpId, directFiltered.name, directFiltered.filtered);
} else {
//update button image
[sender setImage:selectedImage forState:UIControlStateSelected];
[sender setSelected:YES];
//remove person.
personToFilter.filtered = YES;
NSLog(@"Filtering person with corpId: %@, name: %@, filtered: %d", personToFilter.corpId, personToFilter.name, personToFilter.filtered);
}
[self updateSitesToShow];
[self.mapViewController performSelectorOnMainThread:@selector(updateDisplay) withObject:nil waitUntilDone:NO];
}
我的问题与过滤器按钮的状态更新有关。当我的应用加载 tableview 时,一切看起来都很好。当我单击某个单元格行中的过滤器按钮时,按钮的状态会正确更新,并且我的模型对象也会正确更新,因为我看到了我最终要更新的 mapView 的预期行为。
但是,问题是当我单击一个单元格行中的 filterButton 然后向下滚动几行时,我注意到另一个单元格中的另一个过滤器按钮现在与我在上面单击几行的那个状态相同.如果我再次向上滚动,我单击“打开”的原始按钮现在似乎是“关闭”,但它下面的行现在显示为“打开”。当然,所有这些都会影响按钮的实际显示。按钮的实际状态是一致的并且工作正常。
我知道这个问题一定与我的单元格被重复使用的事实有关,而且我猜想不同的单元格行会引用相同的按钮。但是,我不知道这是如何发生的,因为我正在为每个单元格创建一个新的过滤器按钮,无论该单元格是否被重用,并将单元格的 filterButton 属性重置为新创建的对象。例如,请注意 headCount 属性的文本,它也是在单元格 nib 中定义的 UILabel,也被重新分配给每个单元格的新 String 对象,并且每行都正确显示。
我这几天一直在努力解决这个问题。任何帮助或建议都将不胜感激。
【问题讨论】:
标签: objective-c uitableview uibutton nib