Пользовательская кнопка не работает в Swift

#swift #uibutton #addtarget

#swift #uibutton #addtarget

Вопрос:

У меня есть UIViewController, пользовательский UIView и GameController. Пользовательский интерфейс находится поверх UIViewController, и мне нужно разделить просмотры, чтобы отслеживать клики в UIView. У меня есть пользовательская кнопка в пользовательском UIView «Вид интерфейса», которая регистрирует нажатие, но приемник в GameController или UIViewController (пробовал оба) не регистрируют нажатия.

Ниже приведен код, и помощь приветствуется.

Просмотр интерфейса

 class InterfaceView: UIView {

var resetButton: UIButton!

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

    resetButton = UIButton(frame: CGRect(x: 0, y: 0, width: 35, height: 35))
    resetButton.setImage(UIImage(named: "reset"), for: UIControlState())
    addSubview(resetButton)
}

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    // let touches through and only catch the ones on buttons
    let hitView = super.hitTest(point, with: event)

    if hitView is UIButton {
        print("Captured Hit") // Stack Overflow Note: This is working.
        return hitView
    }

    return nil
}
}
  

Игровой контроллер:

 class GameController
{
    var interface: InterfaceView!
    {
        didSet
        {
            interface.resetButton.addTarget(self, action: #selector (GameController.reset), for: .touchUpInside)
        }

    @objc func reset(sender: UIButton!)
    {
        print("button pressed")
    }
}
  

UIViewController:

 class GameViewController: UIViewController
{

fileprivate let controller: GameController
@IBOutlet weak var GameView: UIView!

init(_ coder: NSCoder? = nil)
{
    // Logic Goes Here
    controller = GameController()

    if let coder = coder
    {
        super.init(coder: coder)!
    } else
    {
        super.init(nibName: nil, bundle: nil)
    }
}

required convenience init(coder: NSCoder)
{
    self.init(coder)
}
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
    if let touch = touches.first as UITouch?
    {
        let point = touch.preciseLocation(in: GameView)
        if (touch.view == GameView)
        {
           print("Do stuff")
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
{
    if let touch = touches.first
    {
        let point = touch.preciseLocation(in: GameView)
        if (touch.view == GameView)
        {
            print("Do other stuff")
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
{
    print("Reset Stuff")
}
  

Ответ №1:

Устранено в GameViewController с помощью didSet для установки цели и селектора для нажатия кнопки, а затем с помощью метода в GameViewController для вызова метода в GameController.

 @IBOutlet weak var interface: InterfaceView!
{
    didSet
    {
        interface.resetButton.addTarget(self, action: #selector (GameViewController.reset), for: .touchUpInside)
    }
}