为什么更改TableViewCell中的开关会影响其他单元中的其他开关?

时间:2017-10-19 13:24:14

标签: ios swift uitableview uiswitch

我在自定义UISwitch中与TableViewCell进行了挣扎。

UITableViewCell中的开关将单元格中的项目添加到另一个数组中。但是,我注意到当我更换开关时,它也会改变其他单元中的其他开关。

我认为问题出在TableView dequeueReusableCell函数上。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "currencyCell") as? currencyCell else { return UITableViewCell() }
}

2 个答案:

答案 0 :(得分:1)

您必须将交换机的值存储在某处"外部" UITableviewCell能够将其重置为特定交换机在该单元格中的最后一个值。 我建议使用委托模式将其从单元格中保存(例如,当UISwitch's值更改时)。然后在你取消单元格之后从tableView:cellForRowAt:函数设置它。

答案 1 :(得分:0)

我也有同样的问题。问一位高级开发人员,他建议因为在UITableView单元格中重复使用。当将UISwitch中的第一个UITableView的状态更改为ON并向下滚动时,将重用具有第一个开关的单元格,因此默认情况下,某些后续开关将显示为ON。

将第一个UISwitch置为ON不会改变UITableView中其他开关的状态。相反,第一个开关正在重复使用。

因此,对此的解决方案是将每个单元格中的UISwitch与某些数据绑定。作为一个例子(伪代码):

public class ABC: UITableViewCell
{
    .
    .
    .
    .
    public void UpdateCell(bool switchStatus)
    {
        SwitchInCell.On = switchStatus
    }
}
从继承UITableViewSource类的类调用

UpdateCell 方法。

注意:我来自C#后台并使用Xamarin为iOS开发。所以上面的伪代码在C#中。但可以很容易地转移到Swift。)

我希望这会有所帮助。