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

问题描述:

我有11个或更多行数。只需要在第一个单元格中创建一个UISwitch。当我点击任何行时,UI开关会被复制。在一个tableview单元格中创建一个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// 

} 

请帮忙。

+0

请格式化您的代码。 – shallowThought

+0

最方便的方法是在Interface Builder中创建两个单独的表格视图单元格。 – vadian

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

或者:

在故事板创建两个原型细胞,一个带有和一个没有UISwitch和出队首只如果indexPath.row == 0

或者:

添加UISwitch到故事板的细胞,使一个IBOutlet你的细胞,并在细胞中prepareForReuse()设置self.mySwitch.isHidden = true

这种方式是重新使用单元时的默认状态是隐藏开关。

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

这是一个经典的iOS新手问题。这使我们大多数人在第一次使用表格视图时感到困惑(它首先令我困惑)。

单元格被创建一次,然后重复使用。函数dequeueReusableCellWithIdentifier()会返回一个循环单元格(如果有),或者如果没有,则从您的单元格原型创建一个新单元格。

如果你得到一个再生细胞,它将已经添加你的开关。

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

回收单元格也可能包含值其他字段(如果您已将标签字段设置为包含字符串,则它仍将包含该字符串。)您需要清除旧值并完全配置再循环单元格。 (自定义单元格类和原型不解决这个问题,你总是需要在你的完全配置各个领域。)

有时一个自定义单元格是只需添加一个视图中原本好好的一个大铁锤标准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 

在故事板中添加一个UISwitch。连接插座。在tableview的cellforrowatindexpath中,如果索引是0,设置hidden = false else set hidden = true。希望这可以工作。

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