2015-07-04 4 views
5

mio protocollo delegato mai chiamato

mio primo controller - ViewControllerrapida delegato beetween due controller di vista senza segue

class ViewController: UIViewController,testProtocol { 

    @IBAction func btInit(sender: AnyObject) { 
     println("Bt Init") 

     let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let initViewController: UIViewController = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as targetViewController 
     self.presentViewController(initViewController,animated: false, nil) 

    } 

    var targetController = targetViewController(); 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.targetController.delegate = self 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func testDelegate(){ 
     println(" in my view controller delegate ") 
    } 
} 

Nel mio secondo controller della vista - targetViewController

protocol testProtocol { 
    func testDelegate() // this function the first controllers 
} 

class targetViewController: UIViewController { 

    @IBAction func BtTarget(sender: AnyObject) { 

     println("bt target pressed") 

     delegate?.testDelegate() 
    } 

    var delegate : testProtocol? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func testDelegate(){ 
     println(" in my target view controller delegate ") 
    } 
} 

Perché testDelegate () mai chiamato su ViewController? Che cosa sto facendo di sbagliato? Grazie.

Ho letto un sacco di post su questo, ma tutti gli esempi sono forniti con la transizione di seguito, e non voglio usare un seguito.

risposta

11

In genere si imposta una proprietà delegato di un nuovo controllore di vista in prepareForSegue:. Hai detto che non stai usando un seguito, quindi dovrai istanziare il secondo controller di visualizzazione e presentarlo in qualche modo. È possibile farlo facendo qualcosa di simile:

let storyboard = UIStoryboard(name: "AStoryboardName", bundle: nil) 
let secondVC = storyboard.instantiateViewControllerWithIdentifier(anIdentifier) as! targetViewController 
secondVC.delegate = self 
presentViewController(secondVC, animated: true, completion: nil) 

di avere un metodo testDelegate() in entrambi controller di vista, ma si desidera solo nel primo controller della vista. Quindi il secondo controller della vista può chiamare delegate?.testDelegate() al momento opportuno.

Infine, in genere si vuole fare proprietà delegato debole, quindi vi consiglio di cambiare var delegate : testProtocol?-weak var delegate: testProtocol?

vorrei leggere su delega. Ecco un processo relativamente semplice in 5 fasi per la delega che possono aiutare a:

delegazione in 5 passi:

oggetto A è il delegato per oggetto B, e l'oggetto B invierà i messaggi:

  1. Definire un protocollo delegato per l'oggetto B.
  2. Assegnare all'oggetto B una variabile delegata facoltativa. Questa variabile dovrebbe essere debole.
  3. Rende l'oggetto B inviare messaggi al suo delegato quando accade qualcosa di interessante, come l'utente che preme i pulsanti Annulla o Fine, o quando ha bisogno di un'informazione.
  4. Rendi l'oggetto A conforme al protocollo delegato. Dovrebbe inserire il nome del protocollo nella sua riga di classe e implementare i metodi dal protocollo.
  5. Dì all'oggetto B che l'oggetto A è ora suo delegato (in prepareForSegue (mittente)).
+0

grazie, è lavoro per me. – user2718075

+0

@ user2718075 Ottimo, felice di sentirlo! – trevorj

+0

@trevorj ha lavorato anche per me. Grazie! – iRiziya