Xcode
iOS
UITableViewCell
Swift
UISwitch

[Swift]UITableViewCellのaccessoryViewでaccessoryButtonTappedForRowWithIndexPathが来ない件の対応

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