2016-08-01 4 views
1

Ich habe zwei View-Controller: ViewController1 und ViewController2. Mein Ziel ist, wenn das Segment ausgelöst wird, wenn eine bestimmte Bedingung in ViewController1 erfüllt ist ein Textfeld in ViewController2 deaktiviert werden.Textfeld im Zielansicht-Controller deaktivieren

Ich habe Setup shouldPerformSegueWithIdentifier und prepareForSegue und alles funktioniert gut, aber wenn ich die Bedingung es stürzt sagen, dass es einen Fehler beim Entpacken ein optionales- das Textfeld gefunden. meine ViewController1 ist:

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject!) -> Bool { 
    if condition1=true{ 
     return true 
    } 
    else{ 
     return false 
    } 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier=="segue"){ 
     let destVC:ViewController=segue.destinationViewController as! ViewController2 
     if n==1{ 
      destVC.myTextField.enabled=false 
     } 
    } 
} 

Antwort

2

In prepareForSegue Verfahren myTextField von ViewController2 noch nicht initialisiert ist, so ist, warum Sie einen Fehler unwrapping an optional textField bekommen, zu lösen Ihr Absturz eine Bool Instanz in Ihrem ViewController2 erstellen und dessen Wert in prepareForSegue Methode übergeben.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier=="segue"){ 
      let destVC:ViewController=segue.destinationViewController as! ViewController2 
      if n==1{ 
       destVC.isEnabled=false 
      } 
    } 
} 

erstellen Beispiel isEnabled innerhalb ViewController2 wie diese und verwendet es in der viewDidLoad von ViewController2

var isEnabled: Bool = true 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.myTextField.enabled = self.isEnabled 
} 
+0

Vielen Dank Nirav, wie ein Zauber funktioniert! – user440309

+0

Willkommen, Happy Coding :) –

+0

Noch eine Frage, was passiert, wenn ich will, dass der IsEnabled-Wert falsch bleibt, bis der n-Wert geändert wird? Ich meine, wenn ich zu einem anderen ViewController gehe oder ich die App herunterschalte, wird es wieder auf das Original zurückgesetzt. Soll ich den Wert in nsuserdefaults speichern? – user440309

0

Die Ansichten mit dem Ziel-Controller verbunden sind, sind noch nicht geladen/an diesem Punkt instanziiert.

Erstellen Sie ein boolesches Flag für die Instanz auf dem Ziel-VC, und legen Sie dieses in der Vorbereitungs-Überleitungsfunktion fest. Dann in ViewDidLoad oder später in der Ziel-VC nach diesem Schalter suchen und das Textfeld deaktivieren.

0

Sie können an Ihren Ziel-View-Controller gesetzt Bedingung, dann können Sie dies tun

myTextField.userInteractionEnabled = false 

userInteractionEnabled Ihr Textfeld aktivieren und deaktivieren.