【问题标题】:Create a UISwitch in one tableview cell - UISwitch gets duplicated在一个表格视图单元格中创建一个 UISwitch - UISwitch 被重复
【发布时间】:2017-01-22 16:29:49
【问题描述】:

我有 11 行或更多行数。只需要在第一个单元格中创建一个 UISwitch。当我点击任何一行时,UIswitch 会被复制。

UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:EN_MoreTableViewCell];
if (cell == nil) {
   cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:EN_MoreTableViewCell];
   cell.backgroundColor = [UIColor clearColor];
} 
cell.textLabel.text = languageObject.name;
[cell.textLabel setFont:font];
if (indexPath.row == 0 && [languageObject.name  isEqual: @"All Languages"]) {
    if (!mySwitch) {
       mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(_languageListTableView.frame.size.width - 60, 0, 40, 40)];
       [cell.contentView addSubview:mySwitch];
    }
    cell.accessoryType = UITableViewCellAccessoryNone;  
}
else { //other cell code//

}

请帮忙。

【问题讨论】:

  • 请格式化您的代码。
  • 最方便的方法是在 Interface Builder 中创建两个单独的表格视图单元格。

标签: ios objective-c uitableview uiswitch


【解决方案1】:

这是一个经典的 iOS 新手问题。当我们第一次使用表视图时,这让我们大多数人感到困惑(一开始我确实很困惑。)

单元格被创建一次,然后被一遍又一遍地重复使用。 dequeueReusableCellWithIdentifier() 函数在可用时返回一个回收的单元,如果没有,则从您的单元原型中创建一个新单元。

如果你得到一个回收的电池,它已经添加了你的开关。

处理此问题的最简洁方法是使用UITableViewCell 的自定义子类定义单元原型,其中所有字段都已添加并作为出口连接到单元。然后,当您将单元格出列时,只需将其转换为您的自定义 UITableViewCell 类并使用您定义的属性来访问您的自定义字段(在本例中为您的开关。)

回收的单元格还可能在其其他字段中包含值(例如,如果您将标签字段设置为包含字符串,它仍将包含字符串。)您需要清除旧值并完全配置回收的单元格. (自定义单元格类和原型并不能解决此问题。您始终需要完全配置单元格中的每个字段。)

【讨论】:

    【解决方案2】:

    要么:

    在 Storyboard 中创建两个原型单元格,一个带有 UISwitch,一个不带有 UISwitch,并且仅在 indexPath.row == 0 时出列第一个单元格。

    或者:

    在 Storyboard 中将 UISwitch 添加到您的单元格中,在您的单元格中创建一个 IBOutlet 并在单元格 prepareForReuse() 中设置 self.mySwitch.isHidden = true

    这样重用单元格时的默认状态是隐藏开关。

    稍后如果indexPath.row == 0,设置cell.mySwitch.isHidden = false

    【讨论】:

      【解决方案3】:

      这是因为细胞被重复使用。您可以删除-[UITableViewDataSource tableView:cellForRowAtIndexPath:] 中的所有现有子视图,也可以为每一行创建一个新单元格。

      【讨论】:

        【解决方案4】:

        有时,自定义单元格是一把大锤子,只需将单个视图添加到原本完美的标准UITableViewCell。在这些情况下,惰性创建是一种很好的模式,可以在重用单元(甚至作为任何视图的任何子视图)上只构建一次视图。它的工作原理是这样的:

        // in your cellForRowAtIndexPath, after dequeuing cell
        UISwitch *switch = (UISwitch *)[cell viewWithTag:64];  // make up a unique tag
        if (!switch) {
            switch = [[UISwitch alloc] initWithFrame:...];
            switch.tag = 64;  // 64 must match the tag above
            [cell addSubview:switch];
        }
        // here, switch is always valid, but only created when it was absent
        

        【讨论】:

          【解决方案5】:

          在情节提要中添加一个 UISwitch。连接插座。在tableview的cellforrowatindexpath中,如果索引为0设置hidden=false,否则设置hidden=true。希望这有效。

          【讨论】:

            【解决方案6】:

            您只需隐藏您不想显示的开关并为您想要的特定索引路径动态设置该开关的操作

            【讨论】:

              猜你喜欢
              • 2013-04-19
              • 1970-01-01
              • 2011-04-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-15
              • 2011-08-02
              • 2015-11-21
              相关资源
              最近更新 更多