2016-10-20 9 views
0

Ich habe einen UIViewController, eine Custum UIView und einen GameController. Das CustumUiView ist auf dem UIViewController überlagert und ich muss die Ansichten trennen, um Klicks auf dem UIView zu verfolgen. Ich habe eine benutzerdefinierte Schaltfläche in der Custum UIView "Interface View", die den Klick registriert, aber der Empfänger im GameController oder der UIViewController (beide versucht) registrieren die Klicks nicht.Benutzerdefinierte Schaltfläche nicht in Swift

Code folgt und Hilfe wird geschätzt.

Interface-View

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

Antwort

0

Gelöst b y in GameViewController, mit didset, um das Ziel und Selektor für den Knopf drücken und dann mit einer Methode in GameViewController eine Methode innerhalb GameController aufrufen.

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