addTarget () не работает на пользовательских расширениях - PullRequest
0 голосов
/ 14 декабря 2018

Я сделал кастом UIView() и пытаюсь добавить к нему кнопку okButton.

Однако.Я добавил кнопку, но при отображении моего UIView в одном из моих ViewControllers, но кнопка не будет работать.Это мой код:

class Luna: UIView {

let luna = UIView()
let okButton = UIButton()
typealias completionHandler = (_ success:Bool) -> Void


// Not yet implemented
open var touchOutsideToHide: Bool = true;

private var screenWidth: CGFloat {
    return UIScreen.main.bounds.width
}


override init(frame: CGRect) {
    super.init(frame: frame)
    okButton.setTitleColor(.blue, for: .normal)
    okButton.setTitle("Okay", for: .normal)
    okButton.titleLabel?.font = UIFont(name: "avenirnext-demibold", size: 16)

    let gesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.pressButton(_:)))
    okButton.addGestureRecognizer(gesture)
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

}

}

 //The target function
@objc func pressButton(_ sender: UIButton){ //<- needs `@objc`
    // .. //
    print("btn hit")
}

Я не получаю btn hit в консоли и не зарегистрирован кран

кнопкавидно, добавлено как подпредставление: Снимок экрана

1 Ответ

0 голосов
/ 14 декабря 2018

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

protocol LunaDelegate: class {
    func okButtonTapped(sender: UIButton)
}

class Luna: UIView {

    let luna = UIView()
    let okButton = UIButton()
    typealias completionHandler = (_ success:Bool) -> Void

    weak var delegate: LunaDelegate?

    // Not yet implemented
    open var touchOutsideToHide: Bool = true;

    private var screenWidth: CGFloat {
        return UIScreen.main.bounds.width
    }


    override init(frame: CGRect) {
        super.init(frame: frame)
        okButton.setTitleColor(.blue, for: .normal)
        okButton.setTitle("Okay", for: .normal)
        okButton.titleLabel?.font = UIFont(name: "avenirnext-demibold", size: 16)
        okButton.addTarget(self, action: #selector(pressButton(sender:)), for: .touchUpInside)
}

@IBAction func pressButton(sender: UIButton) {
    if let selfDelegate = self.delegate {
        selfDelegate.okButtonTapped(sender: sender)
    }
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    }
}

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

Использование:

class LunaViewController: UIViewController, LunaDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let luna = Luna(frame: CGRect.init(x: 100, y: 100, width: 100, height: 40))
        luna.delegate = self
        self.view.addSubview(luna)
    }

    // MARK:- Luna Delegate
    func okButtonTapped(sender: UIButton) {
        print("OK Button Pressed From Luna View")
    }
}

Это правильное решение, которое я уже использовал вмой текущий проект.Я надеюсь, что это поможет вам.

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