2017-12-11 2 views
1

Ich versuche, mehr über das Delegatenmuster zu lernen. Ich habe eine App geschrieben, die auf die Kamerarolle des Benutzers zugreift, und ich möchte dieses Bild auf dem View-Controller anzeigen, nachdem der Benutzer das Bild ausgewählt hat. Hier ist, was ich bisher habe:Anzeige des ausgewählten Bildes auf dem Bildschirm mit UIIamgePickerControllerDelegate in Swift

import UIKit 

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    @IBOutlet weak var imagePickerView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    // Delegate Methods 
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      imagePickerView.image = image 
     } 
    } 

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
     self.dismiss(animated: true, completion: nil) 
    } 

    @IBAction func pickAnImage(_ sender: Any) { 

     let pickerController = UIImagePickerController() 
     present(pickerController, animated: true, completion: nil) 
    } 
} 

Die Kamera Roll erscheint wie erwartet und die Abbrechen-Tasten schließen das modale. Wenn Sie ein Bild auswählen, wird das Modal ebenfalls ausgeblendet, das Bild wird jedoch nicht auf dem Bildschirm angezeigt. Ich habe bestätigt, dass meine imagePickerController korrigiert als Steckdose referenziert ist. Was vermisse ich?

+1

Sie vermissen pickerController.delegate = Selbst vor der vorliegenden – Retterdesdialogs

Antwort

2

Sie haben die Controller zu entlassen, sobald das Bild ausgewählt ist, vielleicht die folgende detaillierte Funktion wird Ihnen helfen:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    var selectedImageFromPicker: UIImage? 
    if let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage { 
     selectedImageFromPicker = editedImage 
    } else if let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     selectedImageFromPicker = originalImage 
    } 

    if let selectedImage = selectedImageFromPicker { 
     imageView.image = selectedImage 
    } 
    dismiss(animated: true, completion: nil) 
} 
+0

Ja, die Entlassung des Controllers war ein Schritt, den ich vermisste. Das und die Zuweisung des Delegierten. Anfänger Fehler. –

+0

Gut, schreiben Sie weiter und führen Sie weitere Recherchen durch, bevor Sie nachfragen, oder jemand könnte Ihre Frage einfach als Duplikat kennzeichnen. –

1

Sie müssen den View-Controller als Delegierter von pickerController

// pickerController.delegate = self

Überprüfen Sie auch die imagePickerView Steckdose angeschlossen ist einzustellen.

+0

Mann, das ist etwa als Anfänger eines Fehlers, wie ich machen könnte. Ich habe eine zusätzliche Frage. Wenn ich das Bild auswähle, wird das Modal nicht verworfen. Das Bild wird auf dem Bildschirm angezeigt, nachdem ich ein Bild ausgewählt habe und auf Abbrechen klicken. Wie überspringe ich diesen letzten Schritt? –

+0

Erstellt auch der Verweis auf den Delegaten und das Zuweisen des Delegaten innerhalb der Methode PickAnImage eine gute Idee? Ich habe gesehen, dass diese zu Beginn der Klasse und innerhalb von Methoden deklariert wurden. Ich bin mir nicht sicher, welches das beste Verfahren ist. –

+0

Schließen Sie die Auswahl, wenn Sie auch ausgewählt haben. Die Delegiertenreferenz wird von UIImagePickerController beibehalten. Wir müssen uns keine Sorgen machen. Aber die Idee ist, dass diese Zuordnung nicht erforderlich ist, wenn die Schaltfläche angeklickt wird, da die Zuweisung der Delegierten zum Zeitpunkt des Ladens erfolgen kann. In Button-Klick präsentieren Sie nur den Picker. (Auf diese Weise müssen Sie globale Referenz für Picker halten) – akhiljayaram

0
  • Sicherstellen, dass Sie alle Einschlüsse in der info.plist Datei vorgenommen haben
  • Stellen Sie sicher, Sie haben alle Delegierten eingestellt
  • Stellen Sie sicher, was Sie verwenden Bild anzuzeigen (zB wenn die Bearbeitung auf true gesetzt ist, dann UIImagePickerControllerEditedImage sonst UIImagePickerControllerOriginalImage)
0
import UIKit 

class ViewController: UIViewController, UIImagePickerControllerDelegate, 

    UINavigationControllerDelegate { 


     @IBOutlet weak var imagePickerView: UIImageView! 


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


     func btnPickImageAction(_ sender: UIButton) { 

      // To Get image from photoLibrary source type 
      if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 
       let imagePicker = UIImagePickerController() 
       imagePicker.delegate = self 
       imagePicker.sourceType = .photoLibrary; 
       imagePicker.allowsEditing = true 
       self.present(imagePicker, animated: true, completion: nil) 
      } 

      /* 
      // To capture image from camera Source Type 
      if UIImagePickerController.isSourceTypeAvailable(.camera) { 
       let imagePicker = UIImagePickerController() 
       imagePicker.delegate = self 
       imagePicker.sourceType = .camera; 
       imagePicker.allowsEditing = false 
       self.present(imagePicker, animated: true, completion: nil) 
      } 
      */ 
     } 

     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
      let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
      imagePickerView.image = image 
      dismiss(animated:true, completion: nil) 
     } 
     func imagePickerControllerDidCancel(_ picker: UIImagePickerController) 
     { 
      dismiss(animated:true, completion: nil) 
     } 
    } 
+0

Vergessen Sie nicht, die Datenschutzerklärung - Fotobibliothek Verwendung Beschreibung und Datenschutz - Beschreibung der Kamerabenutzung in Ihre Datei info.plist einzufügen –

Verwandte Themen