Как использовать Selector для передачи двух аргументов с функцией - PullRequest
0 голосов
/ 24 ноября 2018

В cellForRowAtIndexPath я пытаюсь передать выбор переключателя и строку в функцию выбора, но не могу.Пожалуйста, помогите.

let pidName = "someString"
cell.switchSelection.tag = indexPath.row
    cell.switchSelection.addTarget(self, action: 
 #selector(self.switchOperation(_:pid:)), for: .valueChanged)

Здесь я должен передать отправителя и pidName, но не удается

@objc func switchOperation(_ sender: UISwitch, pid: Any){
     let store = (sender).isOn
     let settingTag = pid
}

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Правильное решение - переместить действие в класс вашей ячейки:

class MyCell: UITableViewCell {
    @IBOutlet weak var switchSelection: UISwitch!

    override func awakeFromNib() {
        super.awakeFromNib()
        switchSelection.addTarget(self, action: #selector(MyCell.action(_:)), for: .valueChanged)
    }

    func configure(switchAction: @escaping (Bool) -> Void) {
        self.switchAction = switchAction
    }

    @objc func action(_ sender: UISwitch) {
        switchAction(sender.isOn)
    }

    private var switchAction: (Bool) -> Void = { _ in }
}

Теперь в вашем делегате табличного представления вы можете просто сделать это:

let pidName = "someString"
cell.configure(switchAction: { [weak self] isOn in 
    let store = isOn 
    let settingTag = pid
}

или вы можетеделать:

let pidName = "someString"
cell.configure(switchAction: { [weak self] isOn in 
    self?.switchOperation(isOn: isOn, pid: pid)
}

@objc func switchOperation(isOn: Bool, pid: Any){
    let store = isOn
    let settingTag = pid
}
0 голосов
/ 24 ноября 2018

У вас не может быть другого параметра, так как

cell.switchSelection.addTarget(self, action: 
#selector(self.switchOperation(_:)), for: .valueChanged)

отправляет только один параметр того же типа, что и объект, к которому добавляется цель

вам необходимо установить тег переключателягде-нибудь pid и использовать его вот так

@objc func switchOperation(_ sender: UISwitch) {
   print(sender.tag)
}
...