将照片添加到数组并显示到集合视图错误

Posted

技术标签:

【中文标题】将照片添加到数组并显示到集合视图错误【英文标题】:Adding Photos to Array and Displaying to UICollection View error 【发布时间】:2017-12-06 14:56:00 【问题描述】:

问题

此代码用于将图像设置为数组,但出现以下错误 - 2017-12-06 12:31:21.264812+0000 SmartReceipts[880:172369] [discovery] 错误发现扩展时遇到:Error Domain=PlugInKit Code=13 "query cancelled" UserInfo=NSLocalizedDescription=query cancelled

我需要知道这意味着什么以及是否有可能的解决方法?

import UIKit

class GalleryController: UICollectionViewController,
                         UIImagePickerControllerDelegate,
                         UINavigationControllerDelegate 

    var Receipts = [UIImage?]()

    override func viewDidLoad() 
        super.viewDidLoad()
        self.collectionView?.reloadData()





        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Register cell classes
        //self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)


    

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

        self.dismiss(animated: true, completion: nil)
        print(info);
        let newReceipts = info[UIImagePickerControllerEditedImage] as? UIImage
        self.Receipts.append(newReceipts)

        print("Array Contains \(self.Receipts.count) Receipts")
        print(self.Receipts)
        self.collectionView?.reloadData()

        print("completedIfStatement")
        







    @IBAction func getReceipts(_ sender: Any) 
        print("PlusButtonPressed")

        let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .actionSheet)

        // 2
        let albumAction = UIAlertAction(title: "Album", style: .default, handler: 
            (alert: UIAlertAction!) -> Void in
            print("PhotosOption")
            self.getFromReceipts()
        )
        let cameraAction = UIAlertAction(title: "Camera", style: .default, handler: 
            (alert: UIAlertAction!) -> Void in
            print("CameraOption")
            self.getFromCamera()
        )

        //
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: 
            (alert: UIAlertAction!) -> Void in
            print("Cancel")
        )


        // 4
        optionMenu.addAction(albumAction)
        optionMenu.addAction(cameraAction)
        optionMenu.addAction(cancelAction)

        // 5
        self.present(optionMenu, animated: true, completion: nil)

    


    func getFromReceipts() 

        print("GetFromReceipts")
        let cameraPicker = UIImagePickerController()
        cameraPicker.delegate = self
        cameraPicker.sourceType = .photoLibrary

        self.present(cameraPicker, animated: true, completion: nil )


    

    func getFromCamera() 
        print("GetFromCamera")
        let cameraPicker = UIImagePickerController()
        cameraPicker.delegate = self
        cameraPicker.sourceType = .camera

        self.present(cameraPicker, animated: true, completion: nil )

    



    //Number of Views
    override func numberOfSections(in collectionView: UICollectionView) -> Int 
        return 1
    

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return self.Receipts.count
    

    func collectionView(collectionView: UICollectionView, cellForItemAtindexPath indexPath: NSIndexPath) -> UICollectionViewCell 

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Receipts, for: indexPath as IndexPath) as? PhotoCell


        cell?.imageView.image = self.Receipts[indexPath.row]
        return cell!

    


【问题讨论】:

错误发生在哪一行?你能设置一个断点并检查一下吗。 【参考方案1】:

错误可能来自未请求授权从相机或照片库加载照片。所以你需要在打开相机之前请求授权,比如:

https://developer.apple.com/documentation/photos/phphotolibrary/1620736-requestauthorization

【讨论】:

【参考方案2】:

我猜你没有请求照片/相机授权。 您必须将以下键添加到 Info.plist。

相机权限:

<key>NSCameraUsageDescription</key>
<string> $PRODUCT_NAME Camera Usage< </string>

对于照片库,您将希望这个允许应用用户浏览照片库。

<key>NSPhotoLibraryUsageDescription</key>
<string>$PRODUCT_NAME Photo Usage</string>

在您的源代码中,要请求照片/相机的许可,您需要添加以下代码(Swift 3):

PHPhotoLibrary.requestAuthorization( 
       (newStatus) in 
         if newStatus ==  PHAuthorizationStatus.authorized  
          /* do stuff here */ 
     
)

【讨论】:

已完成但仍然出现错误,它要求许可,当单击图像时仍然出现该错误?? 你需要在func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])末尾关闭照片选择器

以上是关于将照片添加到数组并显示到集合视图错误的主要内容,如果未能解决你的问题,请参考以下文章

在集合视图单元格中自行调整图像大小

如何检查项目是不是存在于多个数组中

将视频添加到自定义照片集合返回错误

当我将新单元格添加到集合视图时,我不断收到布局错误

如何在 Swift 中的集合视图上方添加水平按钮堆栈?

将滚动视图添加到集合视图层次结构