it-roy-ru.com

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

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

Поэтому я сделал что-то вроде этого: В loadView ()

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

Метод: 

func pressButton(button: UIButton) {

    NSLog("pressed!")

}

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

15
user234159

Добавьте код кнопки в свой 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!")
}
26
Rashwan L

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

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

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

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

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

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

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

func cartButtonHandler() {

}
5
arango_86

В Swift 3 используйте это -

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

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

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

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

3
Nikhil Manapure
 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)
0
Divya Rayapati

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

От вашего селектора он нацелен на метод в вашем классе ViewController, но если target для этого действия является самим представлением, то будет иметь смысл, что действие не выполняется. 

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

0
BHendricks
  1. Добавьте код кнопки в метод override func viewDidLoad()
  2. Убедитесь, что ваш обработчик действий помечен как @IBAction так:

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

Тогда это будет работать!

0
SpkingR