@objc функции, #selector и _ sender


#1

Недавно сталкивался с проблемой в создании кастовой ячейки в TableView, lдобавлял туда кнопку и не мог получить ни какой реакции от нажатия от нее, так вот вопрос,
В @objc функциях вроде как нельзя ничего передавать в сигнатуре, но как я понял можно передать сам объект, с которым пользователь взаимодействует, это так?! Я про addTarget и #selektor(@obc funcName), как это правильно работает?!

Если у кого-то была похожая проблема и он ее не решил, то чтобы дать элементу жизнь и добраться до корректного индекса ячейки можно сделать так!

@objc func changeSwitch(_ sender: UISwitch) {
        let cell = sender.superview as! NewNotificationTableViewCell
}

#2

А потом кто-то вложит свитч в стэк вью и будет гадать, почему же сломался этот код.


#3

Так, а можно по подробней?!)


#4

Ваш метод работает на допущении, что ячейка таблицы - всегда супервью для свитча. Потом метод будет использоваться и для других объектов. А стоит только поменять иерархию немного, ломается.

Для таких вещей лучше работают тэги.


#5

Спасибо!
А есть какие ссылки!?


#6

Для супервью?

viewWithTag(_:)

This method searches the current view and all of its subviews for the specified view.


#7

Так, я добавляю элемент в tableViewCell как кнопка или свитч, при нажатии на него я ни как не мог получить ни какой реакции, при указанном target, на stackOverflow нашел такое решение, из этого вопрос, как мне получить тогда индекс ячейки с которой я взаимодействую, надеюсь я правильно изложил мысли!!!


#8

Присвой indexPath.row не всему View ячейки а непосредственно элементу ячейки. Ну что там у тебя кнопка…
cell.myButton.tag = indexPath.row
А потом в селекторе обращайся к нему sender.tag это и будет индекс ячейки. Ну ещё можно проверить что sender это точно кнопка.
let myButton = sender as? UIButton
let indexCell = myButton.tag


#9

Воу!)))
Спасибо большое!!!
Проверю сегодня)


#10

Человеку нужно найти вью в иерархии. Супервью его решение. Я объяснил, почему это плохое решение.