2015-02-12 22 views
9

Sto riscrivendo un tutorial convertendo il codice da Objective-C a swift. L'app si sposta da VC in cui sono presenti 3 cursori (rosso, verde e blu) che impostano il colore di sfondo, un'etichetta del nome del colore e un pulsante che si collega al secondo VC. Nel secondo VC il colore del primo VC viene usato come sfondo e l'utente ha la possibilità di nominare il colore.Passare la variabile al padre in Swift

Quando l'utente immette il nome del colore, deve restituire il nuovo nome di colore al VC originale e l'etichetta che mostra il nome del colore deve mostrare il testo inserito.

Il seguente è il codice che causa problema:

func textFieldShouldReturn(nameEntry: UITextField) -> Bool 
{ 
    ViewController().colourLabel.text = nameEntry.text 
    nameEntry.resignFirstResponder() 
    dismissViewControllerAnimated(true, completion: nil) 
    return true 
} 

L'errore "errore fatale: inaspettatamente trovato nil mentre scartare un valore opzionale" viene generato. Comunque il debug di nomeEntry.text ha una stringa in esso.

Sono un po 'perplesso. Potrei provare a fare una preparazione per seguire lo svolgimento, ma è pensato per essere un'app tutorial.

Acclamazioni

risposta

15

ViewController() in realtà crea una nuova istanza del vostro ViewController. Questo non è un riferimento al già esistente ViewController. Quello che puoi fare è creare una variabile debole che punta al primo ViewController all'interno del secondo ViewController e impostarlo su prepareForSegue o quando viene visualizzato il secondo controller View.

class SecondViewController : UIViewController { 
    weak var firstViewController : ViewController? 

    // Other code 

    func textFieldShouldReturn(nameEntry: UITextField) -> Bool 
    { 
     firstViewController?.colourLabel.text = nameEntry.text 
     nameEntry.resignFirstResponder() 
     dismissViewControllerAnimated(true, completion: nil) 
     return true 
    } 
} 

All'interno First View Controller prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "SecondViewController" { 

     let secondViewController = segue.destinationViewController as SecondViewController 
     secondViewController.firstViewController = self 
    } 
} 
0

E 'possibile che il controller della vista restituito da ViewController() non ha ancora caricato i suoi panorami. Si potrebbe provare a controllare questo in una funzione setter e memorizzarlo per un uso successivo una volta che le viste sono state caricate.

class VC : UIViewController { 
    @IBOutlet weak var colourLabel: UILabel! 
    var savedLabelText: String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.colourLabel.text = self.savedLabelText 
    } 

    func setColorLabelText(label: String) { 
     if self.isViewLoaded() { 
      self.colourLabel.text = label 
     } 
     else { 
      self.savedLabelText = label 
     } 
    } 
} 
Problemi correlati