xcode UIImagePickerController 使应用程序崩溃 | Swift3,Xcode8

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37925583/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 08:56:25  来源:igfitidea点击:

UIImagePickerController crashes app | Swift3, Xcode8

iosxcodeswiftswift3xcode8

提问by ARS

FYI: I′m new to Swift so this might be a really simple problem but I just can′t figure it out.

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

I have been following the Start Developing iOS Apps (Swift)tutorial using the Xcode 8 beta and Swift 3.

我一直在使用 Xcode 8 beta 和 Swift 3关注开始开发 iOS 应用程序 (Swift)教程。

I attached a Tap Gesture Recognizer to a Image View and then added this action in the ViewController.swift :

我将点击手势识别器附加到图像视图,然后在 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)
    }

When the selectImageFromPhotLibrary Action is called by a tap on the Image View the app crashes without showing the ImagePicker.

当通过点击图像视图调用 selectImageFromPhotLibrary 操作时,应用程序崩溃而不显示 ImagePicker。

I guess that the problem is with the new presentinstead of presentViewControllerwhich was introduced in Swift 3

我想问题在于新的礼物而不是在 Swift 3 中引入的presentViewController



视图控制器.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

回答by

Add this key to your info.plist,

将此密钥添加到您的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] 

That's it, Clean & Runthe project.

就是这样,Clean & Run项目。

enter image description here

在此处输入图片说明

回答by Bhoomi Jagani

In xcode 8 new key is added Privacy For -

在 xcode 8 中添加了新密钥 Privacy For -

Media,Location,Photo Library,Reminders,Motion,Calender,Bluetooth,HomeKit,Camera,Contactsetc.. and value is Description for the privacy you will access for.For ex. "We need access to use photo library to make functionality work" or ANY_YOUR_APP_RELATED_DESCRIPTION.

媒体、位置、照片库、提醒、运动、日历、蓝牙、HomeKit、相机、联系人等。值是您将访问的隐私的描述。例如。“我们需要使用照片库才能使功能正常工作”或 ANY_YOUR_APP_RELATED_DESCRIPTION。

enter image description here

在此处输入图片说明

回答by kelsheikh

Noticed a camera key and value needed for camera usage as well.

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

Keys required for both the camera and photo library that need to be in the info.plist:

需要在 info.plist 中的相机和照片库所需的密钥:

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

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

回答by windkostya

I tried adding the privacy messages but those didn't work for me. Then I looked at the Attributes Inspector for the image element itself and checked the box 'User Interaction Enabled', which had previously been unchecked. After doing this, the picker worked. Hope it helps someone.

我尝试添加隐私消息,但这些对我不起作用。然后我查看了图像元素本身的属性检查器,并选中了之前未选中的“启用用户交互”框。完成此操作后,选择器开始工作。希望它可以帮助某人。