Могу ли я добавить значение атрибута для селектора в Swift? - PullRequest
0 голосов
/ 06 февраля 2019

Я читал о селекторах и хотел бы узнать, есть ли способ отправить значение для атрибута функции через селектор.

У меня есть метод:

@objc func acceptBiometrics(newValue: Int){
}

И селектор:

#selector(acceptBiometrics(newValue:))

Так есть ли способ, которым я мог бы отправить, скажем, 1 как новое значение, чтобы я мог иметь два селектора, которые вызывают одну и ту же функцию, просто с другим значением?

РЕДАКТИРОВАТЬ 1: Затем я отправляю этот селектор некоторому контроллеру представления, чтобы создать свой собственный контроллер представления оповещения с кнопкой.Таким образом, селектор вызывается в совершенно другом контроллере представления.Это единственный способ сделать это, а затем отправить VC также значение, которое я хочу отправить с помощью селектора?Я не могу сделать что-то вроде #selector (self.acceptBiometrics (newValue: 1 ))

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Нельзя передать значение с помощью селектора. Используйте следующий метод для передачи значения Int с помощью тега UIbutton.

button.tag = 5
button.addTarget(self, action: #selector(acceptBiometrics(_:)), for: .touchUpInside)

Функция

@objc func acceptBiometrics(_ sender: UIbutton){
    print(sender.tag) //Output 5
}
0 голосов
/ 06 февраля 2019

Вы не .

Вы можете использовать button.tag и установить для него 1 (или любое другое значение Int).

let button = UIButton()
button.tag = 1
button.addTarget(self, action: #selector(acceptBiometrics(_ :)), for: .touchUpInside)

Затем в вашем обработчике:

@objc func acceptBiometrics(_ sender : UIButton) {
    print(sender.tag)
}

Примечания:

Атрибут tag является переменной Int, так что если вам нужны другие TypeВы должны создать пользовательский UIButton только с новой переменной.

Значение по умолчанию tag равно 0, что означает, что если 0 является возможным значением в вашей логике, вам также следует использовать подход с использованием пользовательских компонентов.

Как указывал @matt, "aселектор - это имя метода, а не вызов метода ".

Как указал @Sulthan," Подклассы - это реальное решение ".

Подкласс будет выглядеть так:

class ButtonWithValue : UIButton {
    var value : Int? // note that this could be any Type.
}

Затем создайте его экземпляр и обновите тип параметра отправителя до ButtonWithValue.Внутри обработчика вы проверяете на sender.value

...