Ios UIImagePickerController崩溃应用程序| Swift3,Xcode8

Ios UIImagePickerController崩溃应用程序| Swift3,Xcode8,ios,xcode,swift,swift3,xcode8,Ios,Xcode,Swift,Swift3,Xcode8,仅供参考:我是Swift新手,所以这可能是一个非常简单的问题,但我就是想不出来 我一直在使用Xcode 8 beta版和Swift 3来学习教程 我将点击手势识别器连接到图像视图,然后在ViewController.swift中添加了此操作: @IBAction func selectImageFromPhotoLibrary(_ sender: UITapGestureRecognizer) { // Hide the keyboard. nameTextFie

仅供参考:我是Swift新手,所以这可能是一个非常简单的问题,但我就是想不出来

我一直在使用Xcode 8 beta版和Swift 3来学习教程

我将点击手势识别器连接到图像视图,然后在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)
    }
当点击图像视图调用selectImageFromPhotLibrary操作时,应用程序崩溃,而不显示ImagePicker

我想问题在于新的present而不是swift3中引入的presentViewController


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"
    }


}

控制台输出

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

将此密钥添加到您的
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] 
就这样,
清理并运行项目


将此键添加到您的
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] 
就这样,
清理并运行项目


在xcode 8中,添加了新密钥,用于-

媒体、位置、照片库、提醒、动态、日历、蓝牙、家庭工具包、照相机、联系人等。。值是您将访问的隐私的描述。例如,“我们需要访问才能使用照片库使功能正常工作”或任何与您的应用程序相关的描述


在xcode 8中,添加了新密钥,用于-

媒体、位置、照片库、提醒、动态、日历、蓝牙、家庭工具包、照相机、联系人等。。值是您将访问的隐私的描述。例如,“我们需要访问才能使用照片库使功能正常工作”或任何与您的应用程序相关的描述


注意到相机按键和相机使用所需的值

需要位于info.plist中的相机和照片库所需的键:

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

<key>NSPhotoLibraryUsageDescription</key>
<string>Access needed to photo gallery.</string>
NSCameraUsageDescription
使用相机所需的访问权限。
NSPhotoLibraryUsageDescription
需要访问照片库。

注意到相机按键和相机使用所需的值

需要位于info.plist中的相机和照片库所需的键:

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

<key>NSPhotoLibraryUsageDescription</key>
<string>Access needed to photo gallery.</string>
NSCameraUsageDescription
使用相机所需的访问权限。
NSPhotoLibraryUsageDescription
需要访问照片库。


我尝试添加隐私消息,但这些消息对我无效。然后,我查看了图像元素本身的属性检查器,并选中了先前未选中的“用户交互已启用”框。完成这项工作后,采摘员开始工作。希望它能帮助别人。

我尝试添加隐私消息,但这些消息对我不起作用。然后,我查看了图像元素本身的属性检查器,并选中了先前未选中的“用户交互已启用”框。完成这项工作后,采摘员开始工作。希望它能帮助别人。

你会认为在发布错误时,发布错误会很有用。你调用了错误的方法。您应该这样调用:self.presentViewController(imagePickerController,动画:true,完成:nil)@AMomchilov没有错误消息。应用程序刚刚关闭/crashes@AMomchilov在问题
self中添加了控制台输出。presentViewController(imagePickerController,动画:true,完成:nil)
是教学材料中指定的旧Swift语法的一个示例。当Xcode更新到8.0版(8A218a)时,它会提示用户将找到的任何旧Swift语法更新到Apple Swift 3.0版(swiftlang-800.0.46.2 clang-800.0.38)。上面显示的ViewController.swift代码使用了新的语法。您可能认为在发布错误时,发布错误会很有用。您调用了错误的方法。您应该这样调用:self.presentViewController(imagePickerController,动画:true,完成:nil)@AMomchilov没有错误消息。应用程序刚刚关闭/crashes@AMomchilov在问题
self中添加了控制台输出。presentViewController(imagePickerController,动画:true,完成:nil)
是教学材料中指定的旧Swift语法的一个示例。当Xcode更新到8.0版(8A218a)时,它会提示用户将找到的任何旧Swift语法更新到Apple Swift 3.0版(swiftlang-800.0.46.2 clang-800.0.38)。上面显示的ViewController.swift代码使用了新的syntax.tnx,这有助于我理解为什么将值设置为“YES”?它们应该是显示给用户的短消息。tnx帮助我了解为什么值设置为“是”?它们应该是显示给用户的短消息。您没有将该值设置为
YES
。您将其设置为显示给用户的短消息。@rmaddy是的,他们在新的Xcode中更改了它。我修改了我的答案。接得好。我建议您学习该教程,这样您就可以按照它进行修复。此外,您应该只需要此项目的“照片库使用说明”,而不需要“媒体库使用说明”。后者用于使用MediaPlayer之类的框架访问音乐和其他iTunes同步内容,而本教程项目不会这样做。@rickster是的,你是对的。我忘了这一点,我只是把它放在那里,给出一个关于这些新钥匙的整体概念。谢谢您指出。您没有将该值设置为
YES
。您将其设置为显示给用户的短消息。@rmaddy是的,他们在新的Xcode中更改了它。我修改了我的答案。接得好。我建议您学习该教程,这样您就可以按照它进行修复。此外,您应该只需要此项目的“照片库使用说明”,而不需要“媒体库使用说明”。后者用于使用MediaPlayer之类的框架访问音乐和其他iTunes同步内容,而本教程项目不会这样做。@rickster是的,你是对的。我忘了这一点,我只是把它放在那里,给出一个关于这些新钥匙的整体概念。谢谢你指出。对我来说,解雇不起作用。当我点击“使用照片”按钮时,相机会一次又一次地弹出。有