2017-03-19 1 views
0

Ich versuche, die App zu einem anderen View-Controller zu gehen, nachdem der Benutzer ein Foto aus der Auswahl ausgewählt hat.Absturz beim Drücken auf einen anderen Controller nach `didFinishPickingMediaWithInfo`

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage { 

     let previewController = self.storyboard?.instantiateViewController(withIdentifier: "previewVC") as! PreviewViewController 
     previewController.previewImage.image = image 
     previewController.navigationItem.setHidesBackButton(true, animated: false) 
     self.navigationController?.pushViewController(previewController, animated: true) 
    } 
} 

previewController einfach eine Bildansicht (@IBOutlet weak var previewImage: UIImageView!) und eine Taste, um das Foto zu veröffentlichen, so dass ich versuche, dieses Bild Ansicht setzen das aufgenommene Bild anzuzeigen.

Allerdings bekomme ich einen Absturz "unerwartet gefunden Null beim Auspacken eines optionalen Wertes" auf der previewController.previewImage.image = image Linie. previewImage in der previewController ist Null im Debugger, aber ich bin mir nicht sicher, warum - ist das nicht festgelegt, sobald der Benutzer auf "Wählen" in der Auswahl trifft?

Gibt es hier einen weiteren Schritt?

Antwort

2

Die Hauptursache für Ihr Problem ist, dass Sie zu früh auf die Ausgänge des View-Controllers zugreifen möchten. Die Ansichten und Ausgänge des View-Controllers werden nicht unmittelbar nach dem Instanziieren des View-Controllers erstellt und zugewiesen.

Es ist auch schlechtes Design, um direkt von einem Code außerhalb des View-Controllers auf die Ansichten eines View-Controllers zuzugreifen. Die richtige Lösung ist in diesem Fall, eine UIImage Eigenschaft hinzuzufügen, die Sie festlegen können. Lassen Sie dann den View-Controller seine eigene Bildansicht basierend auf dem Wert dieser Image-Eigenschaft zur richtigen Zeit aktualisieren (z. B. in viewDidLoad).

+0

Ich habe 'var img: UIImage?' Hinzugefügt, um eine Vorschau des Controllers anzuzeigen und 'previewController.img = image' in' didFinishPickingMediaWithInfo' zu setzen. Dann im ViewDidLoad des Preview Controllers setze ich 'self.previewImage.image = img'. Und wenn es jetzt keinen Absturz gibt, passiert nichts, wenn ich im Picker auf Choose tippe. – KingTim

+0

Definieren Sie "nichts passiert". Wird der Vorschau-Controller gedrückt? Ist der aktuelle View-Controller in einem Navigationscontroller? – rmaddy

+0

Nein, buchstäblich passiert nichts - es gibt keinen Absturz, aber weder "wählen" noch "abbrechen" auf dem Picker sind tappable. – KingTim

0

diese

dismiss(animated:true, completion: nil) 

Im Abschluss an Ihre Funktion hinzufügen, können Sie einen Verschluss definieren, die Sie wollen tut, was.

+0

für wen auch immer mich gewählt haben, können Sie bitte kommentieren, damit ich bekommen kann, was falsch ist. – Taher

+0

Ich habe nicht abgestimmt, aber Ihre Antwort bezieht sich nicht auf das Problem in der Frage. Ihre Antwort ist Code, der hinzugefügt werden muss, aber es löst nicht das unmittelbare Problem des Absturzes. – rmaddy

+0

Ich habe dich nicht abgelehnt, nur um klar zu sein. – KingTim

Verwandte Themen