2015-01-09 13 views
10

ボタンを押すとG​​ameControllerでnumpadView(numpadView :)を呼び出す代理人のビューがありますが、動作させることはできません。 touchesBegan()のオーバーロードはうまくいきます。実際にはGameControllerクラスのデリゲート関数を呼び出さないpressDelegate?.numpadView(self)の行です。私はそれが動作するように何が欠けているとして困っていますか?スウィフト代理人が呼び出されていない

簡単にするために、問題に不可欠なものだけを残してコードを消去しました。

NumpadView.swift

protocol NumpadPressDelegateProtocol { 
    func numpadView(numpadView: NumpadView) 
} 

class NumpadView: UIButton{ 
    var pressDelegate: NumpadPressDelegateProtocol? 

    init(char: Character) { 
    let frame = CGRectMake(160, 100, 50, 50) 
    super.init(frame:frame) 

    self.setTitle("\(char)", forState: UIControlState.Normal) 
    self.userInteractionEnabled = true 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    pressDelegate?.numpadView(self) 
    } 
} 

GameController.swift

class GameController: NumpadPressDelegateProtocol { 

    func numpadView(numpadView: NumpadView) { 
    //do something 
    } 

} 

答えて

22

GameControllerNumpadPressDelegateProtocolと宣言するだけでは、コールバックを取得できません。 Gamecontrollerの中にNumpadViewインスタンスのpressDelegateも設定する必要があります。 numpadViewは、インスタンス変数がIBOutletかないこともあると仮定すると、あなたは

インサイドGameControllerのようにデリゲートを設定する必要はありません、私はしません

numpadView.pressDelegate = self 
2

あなたが何かにpressDelegateプロパティを設定することがありますか?表示されているコードでは何も割り当てられていません。コードのどこかに何かを割り当てていますか?

+0

を初期化。私はそれにどこに割り当てるべきですか? –

+0

'GameController'オブジェクトを作成し、それをあなたの' pressDelegate'プロパティに割り当てる必要があります。 'GameController'はあなたの' NumpadPressDelegateProtocol'プロトコルに準拠すると宣言されています。そして 'touchesBegan'関数が実行されると、' numPadView() 'を呼び出すための' pressDelegate'オブジェクトがあります。 –

関連する問題