Застревает с добавлением цели в кнопку в программном режиме 3

Я создал UIButton с помощью Swift 3, и я хочу, чтобы он печатал какое-то сообщение при нажатии.

Итак, я сделал что-то вроде этого: В loadView()

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

Метод:

func pressButton(button: UIButton) {

    NSLog("pressed!")

}

Но ничего не происходит, когда я нажимаю кнопку.

Ответ 1

Добавьте код кнопки в свой viewDidLoad, и он будет работать для вас:

override func viewDidLoad() {
    super.viewDidLoad()
    let button = UIButton(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
    button.backgroundColor = UIColor.gray
    button.addTarget(self, action: #selector(pressButton(button:)), for: .touchUpInside)
    self.view.addSubview(button)
}

func pressButton(button: UIButton) {
    NSLog("pressed!")
}

Вам не нужно добавлять ViewController.pressButton в selector, этого достаточно с помощью function name.

версия Swift 4.x:

let button = UIButton(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
button.backgroundColor = .gray
button.tag = 0
button.addTarget(self, action: #selector(pressButton(_:)), for: .touchUpInside)
self.view.addSubview(button)

@objc func pressButton(_ button: UIButton) {
    print("Button with tag: \(button.tag) clicked!")
}

Ответ 2

попробуйте это в Swift3!

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

@objc func pressButton(button: UIButton) { NSLog("pressed!") }

Ответ 3

Используйте следующий код.

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

Ваше имя класса соответствует FirstViewController

И ваш селектор соответствует следующей функции

func cartButtonHandler() {

}

Ответ 4

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

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

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

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

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

Ответ 5

Вы отмечаете, что вызов addTarget находится в loadView(). Является ли это в вашем пользовательском подзадаче, какого-то рода или viewController?

Из вашего селектора он нацеливается на метод в вашем классе ViewController, но если target для этого действия является самим представлением, то имеет смысл, что действие не проходит.

Если вы объявите свою кнопку в viewController и в viewDidLoad добавите эту цель, как указано выше, тогда сообщение должно быть напечатано по вашему желанию. Я считаю, что вы "нацеливаете" не тот класс на свое действие.

Ответ 6

 let cancelButton = UIButton.init(frame: CGRect(x: popUpView.frame.size.width/2, y: popUpView.frame.size.height-20, width: 30, height: 30))
        cancelButton.backgroundColor = UIColor.init(patternImage: UIImage(named: cancelImage)!)
        cancelButton.addTarget(self, action: #selector(CommentsViewController.canceled), for:.touchUpInside)

Ответ 7

  • Добавить код кнопки в override func viewDidLoad() метод
  • Убедитесь, что ваш обработчик с тегом @IBAction выглядит следующим образом:

    @IBAction func pressButton (кнопка: UIButton) {   печать ( "нажата!" ) }

Тогда это сработает!