UISwitch在自定义accessoryView中

时间:2011-02-12 01:57:25

标签: iphone ios uitableview uiswitch accessoryview


我有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];

一切似乎都没问题,但有一种奇怪的行为。当我打开另一个视图控制器并回到桌面时,开关被神秘地改变了......
这不是数据管理中的问题,只是在细胞重绘中... 请帮助我,我该怎么办?

提前致谢

2 个答案:

答案 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)

Emh ......我发现了问题......它没有链接到表格重绘...
UIControlEventValueChanged上,选择器以这种方式检索切换值和单元格indexPath.row
UISwitch *tempSwitch = (UISwitch *)sender;
UITableViewCell *cell = (UITableViewCell *)[tempSwitch superview];

然后它更新保存在NSMutableArray(tableview的数据源)中的相应对象(数据逻辑类)

但是现在开关不是accessoryView,而是accessoryView的子视图,因此对象以不可预测的方式进行更新。我用第二条superview消息解决了。

对不起我的错误,感谢所有...