2016-06-20 18 views
26

FYI: Ich bin neu bei Swift, also könnte das ein wirklich einfaches Problem sein, aber ich kann es einfach nicht herausfinden.UIImagePickerController stürzt App | ab Swift3, Xcode8

Ich verfolge die Start Developing iOS Apps (Swift) Tutorial die Xcode 8 Beta und Swift mit 3.

ich eine Tap Gestenerkenner auf eine Bildansicht befestigt und dann hinzugefügt, um diese Aktion in der ViewController.swift:

@IBAction func selectImageFromPhotoLibrary(_ sender: UITapGestureRecognizer) { 
     // Hide the keyboard. 
     nameTextField.resignFirstResponder() 

     // UIImagePickerController is a view controller that lets a user pick media from their photo library. 
     let imagePickerController = UIImagePickerController() 

     // Only allow photos to be picked, not taken. 
     imagePickerController.sourceType = .photoLibrary 

     // Make sure ViewController is notified when the user picks an image. 
     imagePickerController.delegate = self 

     present(imagePickerController, animated: true, completion: nil) 
    } 

Wenn die Aktion selectImageFromPhotLibrary durch Tippen auf die Bildansicht aufgerufen wird, stürzt die App ab, ohne den ImagePicker anzuzeigen.

Ich denke, dass das Problem mit dem neuen vorhanden statt presentViewController ist, die in Swift 3


ViewController.swift

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    // MARK: Properties 
    @IBOutlet weak var mealNameLabel: UILabel! 
    @IBOutlet weak var nameTextField: UITextField! 
    @IBOutlet weak var photoImageView: UIImageView! 


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

     // Handle the text field´s user input through delegate callbacks 
     nameTextField.delegate = self 
    } 

    // MARK: UITextFieldDelegate 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     // Hide the keyboard. 
     textField.resignFirstResponder() 
     return true 
    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 
     mealNameLabel.text = textField.text 
    } 

    // MARK: UIImagePickerControllerDelegate 
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
     // Dismiss the picker if the user canceled. 
     dismiss(animated: true, completion: nil) 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     // The info dictionary contains multiple representations of the image, and this uses the original. 
     let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 

     // Set photoImageView to display the selected image. 
     photoImageView.image = selectedImage 

     // Dismiss the picker. 
     dismiss(animated: true, completion: nil) 
    } 


    // MARK: Actions 

    @IBAction func selectImageFromPhotoLibrary(_ sender: UITapGestureRecognizer) { 
     // Hide the keyboard. 
     nameTextField.resignFirstResponder() 

     // UIImagePickerController is a view controller that lets a user pick media from their photo library. 
     let imagePickerController = UIImagePickerController() 

     // Only allow photos to be picked, not taken. 
     imagePickerController.sourceType = .photoLibrary 

     // Make sure ViewController is notified when the user picks an image. 
     imagePickerController.delegate = self 

     present(imagePickerController, animated: true, completion: nil) 
    } 

    @IBAction func setDefaultLabelText(_ sender: UIButton) { 
     mealNameLabel.text = "Default Text" 
    } 


} 


Konsolenausgabe

eingeführt wurde
2016-06-20 17:08:20.568093 FoodTracker[33322:696094] bundleid: com.armin.FoodTracker, enable_level: 0, persist_level: 0, propagate_with_activity: 0 
2016-06-20 17:08:20.569458 FoodTracker[33322:696094] subsystem: com.apple.UIKit, category: HIDEvents, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0 
2016-06-20 17:08:20.604909 FoodTracker[33322:696090] Created DB, header sequence number = 288 
2016-06-20 17:08:20.668341 FoodTracker[33322:696090] Created DB, header sequence number = 288 
2016-06-20 17:08:20.743143 FoodTracker[33322:696090] subsystem: com.apple.BaseBoard, category: MachPort, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0 
2016-06-20 17:08:20.769881 FoodTracker[33322:696091] subsystem: com.apple.FrontBoard, category: Common, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0 
2016-06-20 17:08:22.007665 FoodTracker[33322:695971] subsystem: com.apple.UIKit, category: Touch, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0 
2016-06-20 17:08:22.009799 FoodTracker[33322:695971] subsystem: com.apple.UIKit, category: Gesture, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0 
2016-06-20 17:08:22.012973 FoodTracker[33322:695971] subsystem: com.apple.UIKit, category: GestureEnvironment, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0 
2016-06-20 17:08:22.013820 FoodTracker[33322:695971] subsystem: com.apple.UIKit, category: GestureExclusion, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0 
2016-06-20 17:08:23.061815 FoodTracker[33322:695971] subsystem: com.apple.photos, category: Generic, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0 
+1

Sie würden denken, dass es hilfreich wäre, den Fehler zu posten, wenn Sie einen Fehler melden. – Alexander

+0

Sie rufen eine falsche Methode auf. Sie sollten wie folgt aufrufen: self.presentViewController (imagePickerController, animiert: true, Abschluss: null) – abraaoan

+0

@AMomchilov gibt es keine Fehlermeldung.Die App schließt/stürzt ab – ARS

Antwort

53

Fügen Sie diesen Schlüssel zu Ihrem info.plist,

Key : Privacy - Photo Library Usage Description [ NSPhotoLibraryUsageDescription ] 
String Value : We need access to your camera roll and photo library, so that we can do operations on it. [ Customise it in your own way] 

Das ist es, Clean & Run das Projekt.

enter image description here

+2

Danke, so viele Stunden und Frustrationen gespeichert –

+0

Sie setzen den Wert nicht auf "YES". Sie legen eine kurze Nachricht fest, die dem Benutzer angezeigt wird. – rmaddy

+0

@rmaddy Ja richtig, sie haben es im neuen Xcode geändert. Ich habe meine Antwort geändert. –

15

in Xcode 8 neue Schlüssel hinzugefügt Datenschutz Für -

Medien, Standort, Foto-Bibliothek, Erinnerungen, Bewegung, Kalender, Bluetooth, HomeKit, Kamera, Kontakte etc .. und Wert ist Beschreibung für die Privatsphäre, auf die Sie zugreifen werden. "Wir benötigen Zugriff auf die Fotobibliothek, damit die Funktionalität funktioniert" oder ANY_YOUR_APP_RELATED_DESCRIPTION.

enter image description here

+0

tnx, half mir zu visualisieren –

+1

Warum sind die Werte auf "JA"? Sie sollten kurze Nachrichten sein, die dem Benutzer angezeigt werden. – rmaddy

9

eine Kamerataste und Wert für die Verwendung der Kamera als auch benötigt Bemerkt.

Schlüssel sowohl für die Kamera und Foto-Bibliothek erforderlich, die in der info.plist sein müssen:

<key>NSCameraUsageDescription</key> 
<string>Access needed to use your camera.</string> 

<key>NSPhotoLibraryUsageDescription</key> 
<string>Access needed to photo gallery.</string> 
0

Ich habe versucht, die Datenschutz Nachrichten hinzugefügt, aber die für mich nicht funktioniert hat. Dann habe ich den Attribut-Inspektor für das Bildelement selbst angeschaut und das Kästchen 'Benutzerinteraktion aktiviert' angekreuzt, das zuvor deaktiviert war. Danach arbeitete der Pflücker. Hoffe es hilft jemandem.

+0

Für mich funktioniert die Kündigung nicht. Wenn ich auf den Button 'Foto benutzen' klicke, erscheint die Kamera immer wieder. Gibt es eine Möglichkeit, es zum Laufen zu bringen? –