集合视图未重新加载 (Swift)

Collection view doesn't reload (Swift)

我正在构建一个应用程序(在 swift 中)。其中一个选项应该是允许用户 select 多张照片并上传,或者拍摄一张照片并用它创建 post。 我的想法基于以下层次结构:

按下新照片 post 按钮 -> 用户会看到 UICollection 视图控制器,其中包含来自他们图库中的所有照片以及 select 多张照片的选项(我正在重复使用一个单元格来填充这些照片来自照片库的图像的集合视图),上面应该是相机单元格(用户需要单击按钮以允许访问相机才能拍照)。这是模拟器的表示。

我已经编写了从库中获取照片的代码,并将它们添加到此处的数组中(我将在下面显示这些代码)。 问题是当您最初第一次加载该应用程序并尝试 post 时,系统会要求您授予对照片的访问权限。尽管用户有选择,(他们同意或不同意)他们的集合视图不会更新。

它需要发生什么 - 当用户被要求授予对照片的访问权限并且他们单击 "OK" 时,它应该重新加载集合视图中的数据,但事实并非如此。当他们点击 "Don't allow" 时,它应该关闭整个视图控制器。这是我的代码

class CVController: UICollectionViewController, UINavigationControllerDelegate, UICollectionViewDelegateFlowLayout {

var photosLibraryArray = [UIImage]()

override func viewDidLoad() {
    super.viewDidLoad()

    grabAllPhotosFromPhoneLibrary()

}

// Grab All Photos from Library
func grabAllPhotosFromPhoneLibrary () {

    let imageManager = PHImageManager.default()

    let requestOptions = PHImageRequestOptions()
    requestOptions.isSynchronous = true  // synchronous works better when grabbing all images
    requestOptions.deliveryMode = .opportunistic

    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] // if false = last image we took would show first

    let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)

    // 1. Are there photos in the library
    if fetchResult.count > 0 {

        // 2. if fetch.count > 0 it means there's at least 1 photo in the library
        for i in 0..<fetchResult.count {

            // 3. Cycling through the photos
            imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler:

                { image, error in
                    // 4. Append each image in the array
                    self.photosLibraryArray.append(image!)
            })
        }

    } else {
        print("You've got no photos")
        self.collectionView?.reloadData()
    }

我尝试在 viewWillApear()viewDidApear() 中调用 collectionView.reloadData(),但没有任何效果。

    class CVController: UICollectionViewController, UINavigationControllerDelegate, UICollectionViewDelegateFlowLayout {

    var photosLibraryArray = [UIImage]()

    override func viewDidLoad() {
    super.viewDidLoad()

        checkPhotoLibraryPermission()
    }

添加下面提到的这个功能

    func checkPhotoLibraryPermission() {
        let status = PHPhotoLibrary.authorizationStatus()
        switch status {
        case .authorized: 
        //handle authorized status - // call this function here
                grabAllPhotosFromPhoneLibrary()
            case .denied, .restricted : 
                //handle denied status
            case .notDetermined: 
                // ask for permissions
                PHPhotoLibrary.requestAuthorization() { status in
                    switch status {
                    case .authorized: 
                        // call this function here
                        grabAllPhotosFromPhoneLibrary()

                    case .denied, .restricted: 
                        // as above
                        _ = navigationController?.popViewController(animated: true)
                    case .notDetermined: 
                        // won't happen but still, if you want to handle.
                }
        }
    }
    }

您可以相应地对以下功能进行更改。根据需要。

    // Grab All Photos from Library
    func grabAllPhotosFromPhoneLibrary () {

    let imageManager = PHImageManager.default()

    let requestOptions = PHImageRequestOptions()
    requestOptions.isSynchronous = true  // synchronous works better when grabbing all images
    requestOptions.deliveryMode = .opportunistic

    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] // if false = last image we took would show first

    let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)

    // 1. Are there photos in the library
    if fetchResult.count > 0 {

        // 2. if fetch.count > 0 it means there's at least 1 photo in the library
        for i in 0..<fetchResult.count {

            // 3. Cycling through the photos
            imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler:

                { image, error in
                    // 4. Append each image in the array
                    self.photosLibraryArray.append(image!)
            })
        }
    //Use this reload data here as - you want the data loaded in the array first and then show the data.

    self.collectionView?.reloadData()

    } else {
        print("You've got no photos")
        //self.collectionView?.reloadData()

        // if you want to hide the view controller when there is no photo. pop the view controller from your navigation controller like this. 

     _ = navigationController?.popViewController(animated: true)
    }