UITableViewCellのaccessoryViewにはUISwitchなどを設定できますが、いくらUISwitch
をタッチしてもaccessoryButtonTappedForRowWithIndexPathが呼ばれない。これは仕様らしい。
で、色々調べて、これが一番シンプルそうだった。
UISwitchViewにaddTargetでactionを設定してから、cell.accessoryViewに設定する。
xxxxxViewController.swift
func tableView(_ table: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:UITableViewCell = table.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)
if cell.accessoryView == nil{
let switchView = UISwitch(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
switchView.isOn = false
switchView.tag = indexPath.row
switchView.addTarget(self, action: #selector(switchTriggered), for: .valueChanged)
cell.accessoryView = switchView
}
タッチされた時に呼ばれる処理。
(ここではUISwitchのON/OFFを配列に格納)
xxxxxViewController.swift
@objc func switchTriggered(sender: UISwitch){
switchs[sender.tag] = sender.isOn
}
[確認環境]
Swift:4.0.3
Xcode:9.2
以下、参考元(というか、ほぼそのまま。)
ios - UISwitch in accessory view of a tableviewcell, passing a parameter with the selector to have selector function see the indexpath.row? - Stack Overflow