Что не так с addTarget в Swift 4 - PullRequest
0 голосов
/ 08 января 2019

Ошибка говорит:

Использование локальной переменной 'SwtchChange (Parametr :)' перед ее объявлением

Пожалуйста, что мне нужно изменить?

mySwitch.addTarget(self, action: #selector(SwtchChange(Parametr:)), for: .valueChanged)

func SwtchChange(Parametr: UISwitch) {
    if mySwitch.isOn {
        print ("Yeah")
    } else {
        print ("Nope")
    }

Ответы [ 3 ]

0 голосов
/ 08 января 2019

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

Если вам каким-то образом удалось объявить функцию внутри viewDidLoad или где-то еще, сначала вам нужно переместить функцию на уровень класса, а затем добавить @objc в начало функции.

Если вы добавите свою цель и объявите func в той же области, измените код, как показано ниже, и переместите объявление метода во внешнюю область:

override func viewDidLoad() {
    super.viewDidLoad()
    mySwitch.addTarget(self, action: #selector(swtchChange), for: .valueChanged)
}

@objc func swtchChange(parametr: UISwitch) {
    if parametr.isOn {
        print ("Yeah")
    } else {
        print ("Nope")
    }
}

Также лучше объявить имя вашей функции начинающимся со строчной буквы, как упомянуто в комментариях, поэтому я отредактировал имя вашей функции как swtchChange из SwtchChange. Также имя параметра обновлено и используется в области действия метода.

0 голосов
/ 08 января 2019

При использовании селекторов в Swift вы должны убедиться, что функция помечена @objc. Попробуйте это:

    mySwitch.addTarget(self, action: #selector(switchChanged(_:)), for: .valueChanged)

    @objc func switchChanged(_ sender: UISwitch) {
        if sender.isOn {
           print ("Yeah")
        } else {
           print ("Nope")
        }
    }
0 голосов
/ 08 января 2019

Использование локальной переменной 'SwtchChange (Parametr :)' перед ее объявлением

Вы получаете эту ошибку, потому что у вас есть метод, встроенный в другой метод после его вызова (viewDidLoad, вероятно)

override func viewDidLoad() {
    super.viewDidLoad()
    ...
    mySwitch.addTarget(mySwitch, action: #selector(SwtchChange(Parametr:)), for: .valueChanged)

    func SwtchChange(Parametr: UISwitch) {
        if mySwitch.isOn {
            print ("Yeah")
        } else {
            print ("Nope")
        }
    }
}

Не делайте этого, ваш целевой метод должен быть объявлен в глобальной области видимости вашего контроллера представления, и, поскольку вы используете Selector, вы должны пометить свой метод как @objc

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        mySwitch.addTarget(self, action: #selector(switchChanged(parameter:)), for: .valueChanged)
    }

    @objc func switchChanged(parameter: UISwitch) {
        if mySwitch.isOn {
            print("Yeah")
        } else {
            print("Nope")
        }
    }

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...