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

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

问题描述:

我在自定义TableViewCell中与我的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() } 
} 
+1

这并不足以说明问题是什么,但我认为在返回单元之前,您没有在您的'tableView:cellForRowAt:'方法中重置'UISwitch'的值? – TawaNicolas

+0

请简要说明你的问题是什么? – Zee

+0

你好TawaNicolas,你是对的,我无法设法重置它。你能告诉我怎么做吗?我可以通过“cell.switchBtn(UISwitch)”访问它。但是,不知道应该放入什么(UISwitch)部分。非常感谢! – sc13

你必须存储交换机的价值的地方“外部” UITableviewCell,以便能够将其重置为最后一个值,具体的开关在该单元格。 我建议使用委托模式将其从单元格中保存(例如,当UISwitch's值更改时)。然后在您获取单元格之后,从tableView:cellForRowAt:函数中进行设置。

+0

Hello Bence, 我实际上已经处理了在原型单元格中使用委托方法设置UISwitch。但是我找不到在返回单元格之前在tableView:cellForRowAt:function处设置它的方法。我只能选择“cell.switchBtn(UISwitch)”。那么我怎样才能把它设置为isOn == false,这样新的单元就不会受到影响。非常感谢! – sc13

+0

关于这一点,阅读这篇文章请https://makeapppie.com/2016/10/17/custom-table-view-cells-in-swift-3/ –

+0

你好本斯,我看过这篇文章,但是它做了没有提到Prototype Cell的孩子的价值改变。我只想知道如何在返回新单元格之前在TableView:cellForRowAt中更改UISwitch的值。感谢您的时间和答案。不胜感激。 – sc13

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

开启第一个UISwitch ON不会改变UITableView中其他开关的状态。相反,第一台交换机正在被重用。

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

public class ABC: UITableViewCell 
{ 
    . 
    . 
    . 
    . 
    public void UpdateCell(bool switchStatus) 
    { 
     SwitchInCell.On = switchStatus 
    } 
} 

UpdateCell方法是从继承UITableViewSource类的类调用。

注:。我从C#的背景和使用Xamarin的iOS开发上面这样的伪代码在C#中,但可以很容易地转移到SWIFT)

我希望这有助于。