【问题标题】:Why isn't reloadData() working?为什么 reloadData() 不起作用?
【发布时间】:2017-01-23 21:40:30
【问题描述】:

我在两个不同的应用程序中使用 UICollectionView。一个包含 UICollectionView,另一个不包含。 当视图出现在应用程序中时,我可以使用 reloadData() 刷新 CollectionView,但代码如下,它坚持我使用 self.collectionView!.reloadData() 和!或者 ?作为“UICollectionView 未解包”,然后当视图重新出现时它不会重新加载 collectionView,只有在我完全正常并重新启动应用程序时才有效。

    class SecondViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

var imageArray = [UIImage]()
var assetCollection: PHAssetCollection = PHAssetCollection()
let albumName = "Euphoria"
var albumFound : Bool = false
var photosAsset: PHFetchResult<PHAsset>!






override func viewDidLoad() {
    super.viewDidLoad()

    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)

    let collection = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)
    if let _:AnyObject = collection.firstObject{

        //found the album
        self.albumFound = true
        self.assetCollection = collection.firstObject! as PHAssetCollection

    }else{
        var albumPlaceholder:PHObjectPlaceholder!
        //create the folder
        NSLog("\nFolder \"%@\" does not exist\nCreating now...", albumName)
        PHPhotoLibrary.shared().performChanges({
            let request = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: self.albumName)
            albumPlaceholder = request.placeholderForCreatedAssetCollection
        },
                                               completionHandler: {(success, error)in
                                                if(success){
                                                    print("Successfully created folder")
                                                    self.albumFound = true
                                                    let collection = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [albumPlaceholder.localIdentifier], options: nil)
                                                    self.assetCollection = collection.firstObject! as PHAssetCollection
                                                }else{
                                                    print("Error creating folder")
                                                    self.albumFound = false
                                                }
        })
    }



    grabPhotos()






}

override func viewWillAppear(_ animated: Bool) {

    self.collectionView!.reloadData()
}




func grabPhotos(){

    let imgManager = PHImageManager.default()

    let requestOptions = PHImageRequestOptions()
    requestOptions.isSynchronous = true
    requestOptions.deliveryMode = .highQualityFormat

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


    if let fetchResult : PHFetchResult = PHAsset.fetchAssets(in: self.assetCollection, options:nil){

        if fetchResult.count > 0 {

            for i in 0..<fetchResult.count{

                imgManager.requestImage(for: fetchResult.object(at: i) as PHAsset, targetSize: CGSize(width:200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: {

                    image, error in

                    self.imageArray.append(image!)

                })
            }

        }
        else{
            print("you got no photos!")


        }


    }
}









override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return imageArray.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)

    let imageView = cell.viewWithTag(1) as! UIImageView

    imageView.image = imageArray[indexPath.row]

    return cell
}

【问题讨论】:

    标签: swift collections view uicollectionview


    【解决方案1】:

    grabPhotos() 完成工作之前,似乎已经调用了collectionView!.reloadData()(在viewWillAppear 中)。

    我建议调试执行代码的排序,通过添加两个断点,一个在self.collectionView!.reloadData() 行,另一个在self.imageArray.append(image!) 行,检查哪个是先到达的.

    除了在viewWillAppear中添加self.collectionView!.reloadData(),您可能希望在完成附加到imageArray之后将其添加到grabPhotos()方法中,如下所示:

    override func viewWillAppear(_ animated: Bool) {
        // remove it from here
    }
    
    func grabPhotos() {
        let imgManager = PHImageManager.default()
    
        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = true
        requestOptions.deliveryMode = .highQualityFormat
    
        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    
        if let fetchResult : PHFetchResult = PHAsset.fetchAssets(in: self.assetCollection, options:nil){
            if fetchResult.count > 0 {
                for i in 0..<fetchResult.count{
                    imgManager.requestImage(for: fetchResult.object(at: i) as PHAsset, targetSize: CGSize(width:200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: {
                        image, error in
                        self.imageArray.append(image!)
                    })
                }
    
                // there we go...
                self.collectionView!.reloadData()
    
            } else{
                print("you got no photos!")
            }
        }
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      看起来您用来填充集合视图的数据是在 ViewDidLoad 方法中创建的。此方法仅在第一次显示此视图控制器时被调用一次,这与每次显示视图控制器时调用的 ViewWillAppear 方法不同。因此,即使每次显示视图控制器时 collectionView 都会尝试重新加载数据,但数据永远不会改变。为了获取新数据,您需要将刷新数据的代码(grabPhotos 方法)移至 ViewWillAppear 方法。

      【讨论】:

      • 我尝试将 grabPhotos() 方法添加到 ViewWillAppear 中,但是它会在每次视图出现时抓取照片并复制它们。假设相册中有 10 张照片,每次出现的视图都会翻倍。
      • 您应该重置 imageArray 以等于新结果,而不是将这些元素附加到 imageArray。
      • 谢谢Thomas,我是一个完整的初学者,但我会尝试研究你所说的并找出一些东西。不完全确定如何实施您的建议
      • 在每次调用grabPhotos方法之前运行这行代码:self.imageArray.removaAllObjects()这将清空数组,使其不重复数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多