ios - 如何刷新collectionView

标签 ios swift uicollectionview

我的问题是,当我将图片保存到照片库时,我的 collectionView 没有更新。 如果我单击第一张图片,它会打开我最近保存的图片,但视觉上 collectionView 永远不会更新。我认为 reloadData() 以这种方式工作,但我想它不是。

当应用程序加载时,用户从 collectionView(iPhone 照片库)中挑选照片,然后将其发送到另一个 View ,他在其中编辑图片,然后将其保存到库中,然后使用 unwind segues 返回到第一个 View 。

我的代码:

class pickerViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var activityIndicator:UIActivityIndicatorView = UIActivityIndicatorView()

    var imageArray = [UIImage]()


    override func viewDidLoad() {
        mygtukasMenu.layer.cornerRadius = 10
        mygtukasMenu.clipsToBounds = true
        grabPhotos()
        kolekcija.reloadData()
    }

    @IBOutlet weak var kolekcija: UICollectionView!
    func grabPhotos(){

        let imgManager = PHImageManager.default()

        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = false
        requestOptions.deliveryMode = .opportunistic // Quality of images
        requestOptions.isNetworkAccessAllowed = true

        requestOptions.isSynchronous = true
        requestOptions.progressHandler = {  (progress, error, stop, info) in
            print("progress: \(progress)")
        }

        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]





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

            if fetchResult.count > 0 {
                for i in 0..<fetchResult.count {

                    imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: {
                        image, error in
                        self.imageArray.append(image!)


                    })
                }
            }
            else {
                print("You got no photos")
                kolekcija.reloadData()
            }
        }
        kolekcija.reloadData() // UPDATED
    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        grabPhotos()
        kolekcija.reloadData() // UPDATED
    }


}

最佳答案

当你在 block 中的 func grabPhotos() 获取图片时,你需要调用 reloadData()

imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: {
                    image, error in
                    self.imageArray.append(image!)
                    self.kolekcija.reloadData() <<<<< HERE RELOAD CALL NEED
                })

当你打电话

override func viewDidLoad() {
    mygtukasMenu.layer.cornerRadius = 10
    mygtukasMenu.clipsToBounds = true
    grabPhotos() <<< photos still grabbing at async mode
    kolekcija.reloadData() <<< there is no images grabbed... it still grabbing at async mode when u call reload func here.....
}

关于ios - 如何刷新collectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52835663/

相关文章:

ios - 仅更改一个 collectionview 单元格的对象

ios - 在 Xamarin.iOS 中的哪里添加计时器?

ios - UIPageControllerDelegate 操作顺序向后?

ios - 等待 Swift 计时器完成

swift - 单元格的大小不等于 Collection View 的大小

ios - Swift 3 在没有 Storyboard 的情况下实现 SideMenu 控件(硬编码)

swift - 分别展开每个 collectionView 单元格

ios - 只向右滚动的 UICollectionView(没有向左、向上或向下滚动)

ios - 如何在具有垂直滚动网格的 UICollectionView 中设置列​​之间的间距

ios - 安全 WebSocket WSS(自签名证书)在 iOS Safari 上不起作用