Как использовать метод addTarget в swift 3

вот мой объект button

    let loginRegisterButton:UIButton = {
    let button = UIButton(type: .system)
    button.backgroundColor = UIColor(r: 50 , g: 80, b: 130)
    button.setTitle("Register", for: .normal)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.setTitleColor(.white, for: .normal)
    button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside)
    return button
}()

и вот моя функция

    func handleRegister(){

    FIRAuth.auth()?.createUser(withEmail: email, password: password,completion: { (user, error) in

        if error != nil
        { print("Error Occured")}

        else
        {print("Successfully Authenticated")}
    })        
}

Я получаю ошибку компиляции, если addTarget удален успешно компилируется

Ответ 1

Да, не добавляйте "()", если нет параметра

button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside). 

и если вы хотите получить отправителя

button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside). 

func handleRegister(sender: UIButton){
   //...
}

Edit:

button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside)

больше не работает, вам нужно заменить _ в селекторе именем переменной, которое вы использовали в заголовке функции, в этом случае это будет sender, поэтому рабочий код будет выглядеть следующим образом:

button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside)

Ответ 3

Попробуйте с быстрым 3

cell.TaxToolTips.tag = indexPath.row
        cell.TaxToolTips.addTarget(self, action: #selector(InheritanceTaxViewController.displayToolTipDetails(_:)), for:.touchUpInside)


 func displayToolTipDetails(_ sender : UIButton) {
        print(sender.tag)
        let tooltipString = TaxToolTipsArray[sender.tag]
        self.displayMyAlertMessage(userMessage: tooltipString, status: 202)    
}

Ответ 4

  let button: UIButton = UIButton()
    button.setImage(UIImage(named:"imagename"), for: .normal)
    button.addTarget(self, action:#selector(YourClassName.backAction(_sender:)), for: .touchUpInside)

    button.frame = CGRect.init(x: 5, y: 100, width: 45, height: 45)
    view.addSubview(button)

    public func backAction(_sender: UIButton) {

    }

Ответ 5

В быстрой 3 используйте это -

object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents)

Например (из моего кода) -

self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged)

Просто укажите имя : после имени метода, если вы хотите, чтобы отправитель был как параметр.

Ответ 6

Попробуйте это с помощью Swift 4

buttonSection.addTarget(self, action: #selector(actionWithParam(_:)), for: .touchUpInside)
func actionWithParam(sender: UIButton){
    //...
}

buttonSection.addTarget(self, action: #selector(actionWithoutParam), for: .touchUpInside)
func actionWithoutParam(){
    //...
}

Ответ 7

Попробуйте это с помощью Swift 3

button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside)

Удачи!

Ответ 8

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

В Swift объявления с ключевым словом let являются константами. Конечно, если вы собираетесь добавлять элементы в массив, массив не может быть объявлен как константа, но сегментированный элемент управления должен быть в порядке, верно?! Нет, если вы ссылаетесь на завершенный сегментированный элемент управления в его декларации.

Ссылка на объект (в данном случае a UISegmentedControl, но это также происходит с UIButton) в объявлении, когда вы говорите .addTarget и пусть цель self, вещи авария. Зачем? Потому что self находится в разгаре. Но мы хотим определить поведение как часть объекта... Объявите его лениво как переменную с var. lazy обманывает компилятор, думая, что self четко определен - это заставляет вашего компилятора замолчать во время объявления. Леновые объявленные переменные не устанавливаются до их первого вызова. Таким образом, в этой ситуации lazy позволяет использовать понятие self без проблем при настройке объекта, а затем, когда ваш объект получает .touchUpInside или .valueChanged, или как ваш третий аргумент находится в вашем .addTarget(), THEN он вызывает понятие self, которое в этот момент полностью установлено и полностью подготовлено к действительной цели. Таким образом, это позволяет вам лениться при объявлении переменной. В подобных случаях я думаю, что они могут дать нам ключевое слово, например necessary, но его обычно воспринимают как ленивую, неряшливую практику, и вы не хотите использовать ее во всем своем коде, хотя она может иметь свое место в такого рода ситуации. Что это за

В Swift нет lazy let (нет lazy для констант).

Вот документация Apple по ленивым.

Вот Apple о переменных и константах. В разделе "Справочник по языку" содержится немного больше информации Declarations.

Ответ 9

Вместо

let loginRegisterButton:UIButton = {
//...  }()

Try:

lazy var loginRegisterButton:UIButton = {
//...  }()

Это должно исправить ошибку компиляции!!!