在一个tableview单元格中创建一个UISwitch - UISwitch被复制

时间:2017-01-22 16:29:49

标签: ios objective-c uitableview uiswitch

我有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//

}

请帮忙。

6 个答案:

答案 0 :(得分:1)

或者:

在Storyboard中创建两个原型单元格,一个带有UISwitch,一个没有indexPath.row == 0,只有UISwitch才会出现第一个。

或者:

IBOutlet添加到故事板中的单元格,为您的单元格设置self.mySwitch.isHidden = true,并在单元格prepareForReuse()中设置indexPath.row == 0

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

稍后cell.mySwitch.isHidden = false,请设置coreos/jetcd

答案 1 :(得分:1)

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

单元格被创建一次,然后一遍又一遍地重复使用。函数dequeueReusableCellWithIdentifier()返回一个可循环使用的单元格,如果没有,则返回一个新单元格。

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

有时,自定义单元格只是将一个视图添加到一个非常好的标准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

答案 4 :(得分:0)

在故事板中添加UISwitch。连接插座。在tableview的cellforrowatindexpath中,如果索引为0,则设置hidden = false,否则设置hidden = true。希望这有效。

答案 5 :(得分:0)

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