我有UITableViewCell
子类,其中我使用UISwitch
作为accessoryView
这样:
mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
self.accessoryView = mySwitch;
一切都好!该应用程序工作正常。
现在我需要在开关上方添加一些UIImageView
,所以我想“好吧,让我们制作一个自定义的配件!”:
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 10.0f, 100.0f, 60.0f)];
...
mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0.0f, 22.0f, 94.0f, 27.0f)];
[myView addSubview:mySwitch];
self.accessoryView = myView;
[myView release];
一切似乎都没问题,但有一种奇怪的行为。当我打开另一个视图控制器并回到桌面时,开关被神秘地改变了......
这不是数据管理中的问题,只是在细胞重绘中...
请帮助我,我该怎么办?
提前致谢
答案 0 :(得分:2)
这是因为细胞被重复使用。因此,如果您将子视图添加到单元格的内容视图中,然后在该单元格在另一行中重复使用后,该视图将显示在该行中。避免这种情况的最佳方法是将NSArray保存在表的数据源(通常是视图控制器)中,该数据源包含所有自定义视图(带子视图)。然后你可以这样做:
-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath {
NSInteger row = indexPath.row;
static NSString* cellIdentifier = @"Trololo";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];
if( !cell ) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier: cellIdentifier] autorelease];
}
[[cell.contentView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
[cell.contentView addSubview: [_your_cell_views objectAtIndex: row]];
return cell;
}
答案 1 :(得分:0)
UIControlEventValueChanged
上,选择器以这种方式检索切换值和单元格indexPath.row
:UISwitch *tempSwitch = (UISwitch *)sender;
UITableViewCell *cell = (UITableViewCell *)[tempSwitch superview];
NSMutableArray
(tableview的数据源)中的相应对象(数据逻辑类)
superview
消息解决了。