2016-10-20 3 views
0

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

Код следует и помощь приветствуется.

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

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 
} 
} 

Game Controller:

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") 
} 

ответ

0

Решенный б y в GameViewController, используя setSet, чтобы установить цель и селектор для нажатия кнопки, а затем используя метод в GameViewController для вызова метода в GameController.

@IBOutlet weak var interface: InterfaceView! 
{ 
    didSet 
    { 
     interface.resetButton.addTarget(self, action: #selector (GameViewController.reset), for: .touchUpInside) 
    } 
} 
Смежные вопросы