2015-02-12 12 views
9

Ponownie piszę samouczek konwertujący kod z Objective-C na szybki. Aplikacja przesuwa się z VC, gdzie znajdują się 3 suwaki (czerwony, zielony i niebieski), które ustawiają kolor tła, etykietę nazwy koloru i przycisk, który łączy się z drugim VC. W drugim polu VC kolor z pierwszego VC jest używany jako tło, a użytkownik ma szansę nazwać ten kolor.Przekazywanie zmiennej z powrotem do rodzica w Swift

Gdy użytkownik wprowadzi nazwę koloru, powinien zwrócić nazwę nowego koloru do oryginalnego znaku VC, a etykieta z nazwą koloru powinna pokazywać wprowadzony tekst.

Poniżej znajduje się kod, który jest przyczyną problemu:

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

Błąd "fatal error: nieoczekiwanie stwierdzili nil podczas rozpakowywania wartość Opcjonalny" jest generowany. Jednak debugowanie nameEntry.text zawiera ciąg znaków.

Jestem trochę zakłopotany. Mogę spróbować przygotować się do odprężenia, ale ma to być aplikacja samouczka.

Cheers

Odpowiedz

15

ViewController() faktycznie tworzy nową instancję swojej ViewController. To nie jest odniesienie do już istniejącego ViewController. Możesz utworzyć słabą zmienną wskazującą pierwszy ViewController w drugim ViewController i ustawić go na prepareForSegue lub gdy pojawi się drugi kontroler 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 
    } 
} 

Wewnątrz pierwszy widok Controller prepareForSegue

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

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

Jest możliwe, że kontroler widoku zwracane przez ViewController() nie została jeszcze załadowana swoje poglądy. Możesz spróbować sprawdzić to w funkcji ustawiającej i zapisać ją do późniejszego wykorzystania po załadowaniu widoków.

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 
     } 
    } 
} 
Powiązane problemy