在tableviewcell的附件视图中使用UISwitch,使用选择器传递参数以使选择器函数看到indexpath.row?

时间:2016-09-19 05:41:27

标签: ios swift uitableview swift3 uiswitch

我在tableviewcontroller中有UISwitch,当切换开关时,我希望它改变我在视图控制器内创建的数组中的布尔变量的值,该数组与该单元相关。有点像IOS上的Stock Alarm App,其中每个单元格都有UISwitch,并且切换开关将关闭每个单独的警报。因此UISwitch及其选择器代码位于cellForRowAtIndexPath方法

//switch
    let lightSwitch = UISwitch(frame: CGRectZero) as UISwitch
    lightSwitch.on = false
    lightSwitch.addTarget(self, action: #selector(switchTriggered), forControlEvents: .ValueChanged)
    //lightSwitch.addTarget(self, action: "switchTriggered", forControlEvents: .ValueChanged )

    cell.accessoryView = lightSwitch

我希望它能够做到这一点

func switchTriggered(a: Int) {
    changeValueOfArray = array[indexPath.row]
}

我还没有为该部分编写代码,但我的问题是,我如何让switchTriggered函数看到indexPath.row值,而不将其作为参数传递给函数,因为我可以'因为它是一个选择器?

3 个答案:

答案 0 :(得分:5)

let lightSwitch = UISwitch(frame: CGRectZero) as UISwitch
    lightSwitch.on = false
    lightSwitch.addTarget(self, action: #selector(switchTriggered), forControlEvents: .ValueChanged)
    lightSwitch.tag = indexpath.row
    cell.accessoryView = lightSwitch

将布尔值保存在Array

    func switchTriggered(sender: UISwitch) {
      sender.on ? array[sender.tag]=1 : array[sender.tag]=0
     }
}

答案 1 :(得分:3)

基本思路是,您可以捕获切换开关的单元格,然后使用tableView.indexPath(for:)UITableViewCell引用转换为NSIndexPath,并且可以使用其{ {1}}标识模型结构中的哪一行需要更新。

其构成要素包括:

  1. 创建一个模型对象,捕获要在表视图中显示的信息。例如,让我们假设每个单元格都包含一个row name和一个反映灯是否亮起的布尔值:

    Room
  2. 然后表视图控制器将有一个数组:

    struct Room {
        var name: String
        var lightsOn: Bool
    }
    
  3. 我定义了一个var rooms: [Room]! 子类,其中包含标签和开关的插座。我还将灯开关的“值已更改”连接到该单元格中的方法。我还为单元设置了一个协议,通知其表视图控制器翻转了灯开关:

    UITableViewCell

    我显然将单元格原型的基类设置为此protocol RoomLightDelegate: class { func didFlipSwitch(for cell: UITableViewCell, value: Bool) } class RoomCell: UITableViewCell { weak var delegate: RoomLightDelegate? @IBOutlet weak var roomNameLabel: UILabel! @IBOutlet weak var lightSwitch: UISwitch! @IBAction func didChangeValue(_ sender: UISwitch) { delegate?.didFlipSwitch(for: self, value: sender.isOn) } } 子类,并连接UITableViewCell引用以及@IBOutlet以更改值开关。

  4. 然后我会根据@IBAction属性填充单元格UITableViewDataSource

    Room
  5. 注意,上面的override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return rooms.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchCell", for: indexPath) as! RoomCell let room = rooms[indexPath.row] cell.roomNameLabel.text = room.name cell.lightSwitch.setOn(room.lightsOn, animated: false) cell.delegate = self return cell } 也将自己指定为单元格的cellForRowAtIndexPath,因此我们希望实现delegate协议以在灯光时更新我们的模型开关被翻转:

    RoomLightDelegate
  6. 现在,我不想让你担心上面的细节。相反,尝试捕捉一些基本想法:

    根据您的直接问题,一旦您知道更新了哪个单元格,您可以查询extension ViewController: RoomLightDelegate { func didFlipSwitch(for cell: UITableViewCell, value: Bool) { if let indexPath = tableView.indexPath(for: cell) { rooms[indexPath.row].lightsOn = value } } } 以确定UITableView引用对应的NSIndexPath,使用{ {1}}。

答案 2 :(得分:1)

Swift 3更新:

let lightSwitch = UISwitch(frame: CGRect.zero) as UISwitch
lightSwitch.isOn = false
lightSwitch.addTarget(self, action: #selector(switchTriggered), for: .valueChanged)
lightSwitch.tag = indexPath.row
cell?.accessoryView = lightSwitch