2015-01-09 13 views
10

Ho una vista con un delegato che voglio avere chiamata numpadView (numpadView :) in GameController alla pressione del pulsante, tuttavia non riesco a farlo funzionare. Il sovraccarico di touchBegan() funziona bene, è davvero la linea con pressDelegate? .numpadView (self) che non chiama la funzione delegate nella classe GameController. Sono perplesso su cosa manca per farlo funzionare?Il delegato Swift non viene chiamato

Ho pulito il codice per lasciare solo l'essenziale correlato al problema per semplicità.

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 
    } 

} 

risposta

22

La dichiarazione GameController come NumpadPressDelegateProtocol non è sufficiente per ottenere una richiamata. È inoltre necessario impostare dell'istanza NumpadView all'interno dello Gamecontroller. Supponendo numpadView è la variabile di istanza sia IBOutlet o no, è necessario impostare il delegato come

All'interno Gamecontroller init

numpadView.pressDelegate = self 
2

Avete impostare la proprietà pressDelegate a qualcosa? Nulla è assegnato ad esso nel codice che hai mostrato. Ti assegni qualcosa altrove nel tuo codice?

+0

No, non lo faccio. Cosa dovrei assegnare ad esso e dove? –

+0

È necessario creare un oggetto 'GameController' e assegnarlo alla proprietà' pressDelegate'. Poiché 'GameController' è dichiarato conforme al tuo protocollo' NumpadPressDelegateProtocol'. Quindi, quando viene eseguita la funzione 'toccaBegan', ci sarà un oggetto' pressDelegate' per richiamare 'numpadView()' su. –

Problemi correlati