两个部分有一个uiswitch? - 斯威夫特

时间:2016-03-30 19:42:34

标签: ios swift xcode7 uiswitch

我有一个工作开关和一个开关状态,它使用Indexpath的行号和存储在字典中的bool来跟踪哪个开关被打开。虽然这只适用于一个部分。我正在困难时期阻止它蔓延到下一部分,如下所示:

Section 0 Row 3 switch turned on

Section 1 Row 3 switch turned on without me pressing it.

有没有办法只保留特定部分的开关?现在我使用两个原型单元,一个用于数据显示,其中只包含一个开关,另一个单元用于显示节标题。

以下是一些我认为有助于看到我放下的代码:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("advCell", forIndexPath: indexPath) as! advDataCell

        cell.advDelegate = self

        switch(indexPath.section) {
        case 0:
            cell.lblCategoryItem.text = foodCategories[indexPath.row]["name"]


        case 1:
            cell.lblCategoryItem.text = activitiesCategories[indexPath.row]["name"]

        default:
            return cell
        }


        if advSwitchStates[indexPath.row] != nil {

            cell.advOnOffSwitch.on = advSwitchStates[indexPath.row]!
        }
        else {
            cell.advOnOffSwitch.on = false
        }
        cell.advOnOffSwitch.on = advSwitchStates[indexPath.row] ?? false

        return cell
    }



func switchCell(advSwitchCell: advDataCell,didChangeValue value: Bool) {
        let indexPath = tableView.indexPathForCell(advSwitchCell)!

        print("This advanced filter controller has received the switch event.")
        advSwitchStates[indexPath.row] = value

    }

我用来存储开关状态:

var advSwitchStates = [Int: Bool]()

2 个答案:

答案 0 :(得分:1)

在你的cellForRowAtIndexPath中,你将一个回收的细胞出列,就像你应该做的那样。您需要完全配置单元格中的每个视图, IN ALL CASES 。这意味着在所有情况下,您都需要为advOnOffSwitch设置一个值。

cellForRowAtIndexPath方法中,您有一个用于0,1或任何其他值的节值的switch语句。如果section值不是0或1,则返回时不设置advOnOffSwitch的状态。如果您回收已设置advOnOffSwitch的单元格,它将保持打开状态,这是您不想要的。像这样更改你的switch语句:

    switch(indexPath.section) {
    case 0:
        cell.lblCategoryItem.text = foodCategories[indexPath.row]["name"]


    case 1:
        cell.lblCategoryItem.text = activitiesCategories[indexPath.row]["name"]

    default:
        cell.advOnOffSwitch.on = false 
        return cell
    }

使用该代码,您可以将开关强制关闭,以便为第0或第1部分以外的部分启动。

答案 1 :(得分:0)

有两个不同的问题,首先在设置单元格名称时摆脱早期返回:

switch(indexPath.section) {
case 0:
    cell.lblCategoryItem.text = foodCategories[indexPath.row]["name"]


default:
    cell.lblCategoryItem.text = activitiesCategories[indexPath.row]["name"]
}

其次,由于您有多个部分,因此需要使用section和row作为键来跟踪切换状态。最简单的方法是使advSwitchStates的键成为NSIndexPath。

e.g。声明为:

var advSwitchStates = [NSIndexPath: Bool]()

然后在cellForRowAtIndexPath

cell.advOnOffSwitch.on = advSwitchStates[indexPath] ?? false