2014-09-10 15 views
10

sto cercando di passare i dati dal modale ViewController al suo fonte ViewController. Penso di dover usare la delega ma non funziona.dati Passo quando respingere modale viewController in rapida

protocol communicationControllerCamera{ 
    func backFromCamera() 
} 

class Camera: UIViewController{ 
    var delegate: communicationControllerCamera 

    init(){ 
     self.delegate.backFromCamera() 
    } 
} 


class SceneBuilder: UIViewController, communicationControllerCamera{ 
    func backFromCamera(){ // Never called 
     println("YEAHH") 
    } 
} 

Il metodo backFromCamera non viene chiamato. Che cosa ho fatto di sbagliato?

+0

Sembra che tu non abbia mai impostato il delegato – Gad

+0

Come posso impostare il delegato? – Marco

risposta

23

Non hai impostato un delegato in modo che fosse vuoto quando hai provato a chiamare backFromCamera().

Ecco un semplice esempio di funzionamento che è possibile testare. Si noti l'uso del tipo facoltativo (?) Per il delegato.

// Camera class 
protocol communicationControllerCamera { 
    func backFromCamera() 
} 

class Camera: UIViewController { 
    var delegate: communicationControllerCamera? = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.delegate?.backFromCamera() 
    } 
} 



// SceneBuilder class 
class SceneBuilder: UIViewController, communicationControllerCamera { 

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

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     var myCamera = Camera() 
     myCamera.delegate = self 

     self.presentModalViewController(myCamera, animated: true) 
    } 

    func backFromCamera() { 
     println("Back from camera") 
    } 
} 

È possibile trovare tutte le informazioni necessarie in Apple's Swift documentation.

+0

posso usare la chiusura per implementare i dati di passaggio su due controller, proprio come il tuo esempio. @Gad – lighter

+0

Sì! naturalmente è possibile implementare questa soluzione con il protocollo: funcbackFromCamera (stringa: stringa) ... –

5

Ovviamente la risposta scelta è corretta, ma non mi è stata d'aiuto. Tuttavia, ho implementato con successo i protocolli, quindi volevo fornire la mia spiegazione nel caso in cui qualcuno stesse lottando per afferrare il concetto, come lo ero io.

Codice protocollo è scritto in tre punti:

  • due Categorie viewController
  • protocollo stesso (codice scritto al di fuori delle classi VC)

Quando scrivo i miei protocolli, ho inseriscili nel mio documento "ToolBox" e scrivo ancora commenti per ricordare a me stesso quali VC stanno facendo cosa. Due esempi:

1. Main Protocol code

quindi c'è sempre:

  1. Il codice di protocollo (vedi sopra)
  2. codice in un VC che avvia l'azione
  3. codice in un VC che è delegato a svolgere l'azione

1. Il codice di protocollo

Vedere l'immagine sopra per un riferimento. In sostanza, il codice del protocollo è proprio il punto in cui si dà al protocollo un nome e si dichiara quali funzioni si desidera chiamare/delegare in remoto. Assegna un nome al protocollo. Dichiarare i nomi delle funzioni che possono essere chiamati e dichiarano i propri tipi di parametri come ad esempio stringhe, ecc

2. codice in un VC che avvia l'azione

Questo è il codice che avvia il protocollo . In questo esempio, questo è il codice di una cella di tabella, che deve delegare alcuni lavori alla tabella principale VC. Il primo screenshot mostra la creazione della variabile delegata e il secondo screenshot è l'uso effettivo di quella variabile.

enter image description here

Così il codice qui sotto sono pulsanti table-cell. Hanno tutti bisogno di attivare il codice al di fuori della cella VC, in modo che tutti attivino le funzioni utilizzando il protocollo che ho dichiarato sopra.

enter image description here

3. Codice in una VC che è delegata a svolgere l'azione

Ora il protocollo viene chiamato, ma che VC risponde alla chiamata? Per rispondere a questa domanda, scegliere il VC e aggiungere il nome del protocollo per la dichiarazione di classe:

enter image description here

Infine, è necessario la carne reale di tutta la faccenda. Non il grilletto, non il protocollo stesso, non la dichiarazione della classe ... ma la funzione reale che si desidera chiamare:

enter image description here

Spero che questo aiuti

Non so perché i protocolli semplicemente non affonderei nel mio grosso cranio, ma non lo fecero. Spero che questo aiuti gli altri come me!

+6

Come si copia il codice? Le schermate non sono pensate per questo – Kalzem

+1

sei sicuro di voler aiutarci a usare il tuo codice? –

+0

Ottima risposta! +1 per il lavoro extra svolto per capire e spiegare le cose in modo più chiaro! –

Problemi correlati