为什么在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() }
}
你必须存储交换机的价值的地方“外部” UITableviewCell
,以便能够将其重置为最后一个值,具体的开关在该单元格。 我建议使用委托模式将其从单元格中保存(例如,当UISwitch's
值更改时)。然后在您获取单元格之后,从tableView:cellForRowAt:
函数中进行设置。
Hello Bence, 我实际上已经处理了在原型单元格中使用委托方法设置UISwitch。但是我找不到在返回单元格之前在tableView:cellForRowAt:function处设置它的方法。我只能选择“cell.switchBtn(UISwitch)”。那么我怎样才能把它设置为isOn == false,这样新的单元就不会受到影响。非常感谢! – sc13
关于这一点,阅读这篇文章请https://makeapppie.com/2016/10/17/custom-table-view-cells-in-swift-3/ –
你好本斯,我看过这篇文章,但是它做了没有提到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)
我希望这有助于。
这并不足以说明问题是什么,但我认为在返回单元之前,您没有在您的'tableView:cellForRowAt:'方法中重置'UISwitch'的值? – TawaNicolas
请简要说明你的问题是什么? – Zee
你好TawaNicolas,你是对的,我无法设法重置它。你能告诉我怎么做吗?我可以通过“cell.switchBtn(UISwitch)”访问它。但是,不知道应该放入什么(UISwitch)部分。非常感谢! – sc13