【问题标题】:UISwitch in a custom accessoryView自定义附件视图中的 UISwitch
【发布时间】:2011-02-12 01:57:25
【问题描述】:


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

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

提前致谢

【问题讨论】:

    标签: iphone ios uitableview uiswitch accessoryview


    【解决方案1】:

    发生这种情况是因为单元格被重复使用。因此,如果您将子视图添加到单元格的内容视图,然后在该单元格在另一行中重复使用后,该视图将出现在该行中。避免这种情况的最佳方法是将 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;
    }
    

    【讨论】:

    • 等等,[cell.contentView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)] 将删除 所有 子视图,包括文本标签。您只需正确设置accessoryView
    • 好吧。但如果您的手机上有很多东西,这是通用的解决方案。
    【解决方案2】:

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

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

    但是现在switch不是accessoryView,而是accessoryView的一个子视图,所以对象的更新是不可预知的。我解决了第二条superview 消息。

    对不起我的错误,谢谢大家...

    【讨论】:

      猜你喜欢
      • 2011-08-23
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多