2


我有我的子类,我以这种方式UITableViewCell使用UISwitchas : 一切都很好!该应用程序运行良好。 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];


提前致谢

4

2 回答 2

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;
}
于 2011-02-12T02:40:38.160 回答
0

Emh...我发现了问题...它没有链接到表重绘...
在选择器上以这种方式UIControlEventValueChanged检索开关值和单元格: 然后它更新保存的相应对象(数据逻辑类的)在(tableview的数据源) 但是现在switch不是accessoryView,而是accessoryView的一个子视图,所以对象以不可预知的方式更新。我用第二条消息解决了。 对不起我的错误,谢谢大家...indexPath.row
UISwitch *tempSwitch = (UISwitch *)sender;
UITableViewCell *cell = (UITableViewCell *)[tempSwitch superview];

NSMutableArray

superview

于 2011-02-12T14:58:15.870 回答