通过UITableView循环使用自定义UITableViewCells

时间:2015-06-24 22:40:22

标签: ios swift uitableview

我正在创建一个带有设置页面的应用程序,该页面设置为带有自定义单元格的UITableView。这些单元格设置如下:

每次更换其中一个开关时,我需要遍历这些单元格的表格。我需要检查哪些开关打开以制作用户首选设置的数组(在这种情况下,打开的单元格将其标签添加到数组中)。以下是我尝试使用的代码:

for var x = 0; x < preferredDistances.count; x++ {

            var indexPath = NSIndexPath(forRow: x, inSection: 0)

            let cell : SettingsCell = settingsTable.cellForRowAtIndexPath(indexPath) as! SettingsCell

            if cell.settingsCellSwitch.on {
                preferredDistances.append(cell.settingsCellLabel.text!)
            }

        }

当尝试使用此代码遍历UITableView时,我的单元格返回nil。我在这段代码中做错了什么,我该如何解决?

2 个答案:

答案 0 :(得分:2)

您的方法存在根本缺陷。您有责任了解启用了哪些开关。由于表格单元格被重用,因此无法可靠地询问它们设置的开关。

这是另一种可能的方法:

  • 初始化视图时(例如,在viewDidLoad()中),使用默认设置创建一个数组:

    var settings = [true, false, false, false, true, false]
    

    此数组的长度应与您在numberOfRowsInSection中引用的数组的长度相同。

  • 更新滑块(由用户更改)时,更新阵列中的相应项目

  • cellForRowAtIndexPath中,使用数组中的相关设置来设置滑块的值。

答案 1 :(得分:0)

正确的答案是不要通过单元格来确定其开关的状态。您应该有一个模型(可以像NSArrayNSDictionary一样简单)支持存储交换机状态的UITableView(并且每当您更新交换机时该模型都会更新)

这样,当需要获得所有开关的状态时,你会询问你的模型,而不是询问视图。

正如其中一位评论员指出的那样,在iOS上,UITableViewCell被重用(如果设计正确),这使得您当前的方法也非常不可扩展。