2017-01-23 64 views
0

我在两个不同的应用程序中使用UICollectionView。一个UICollectionView被包含,另一个不包含。 我可以使用reloadData()来刷新CollectionView,但是当下面的代码出现在应用程序中时,它坚持使用self.collectionView!.reloadData()和!要么 ?作为“UICollectionView不解开”,然后当视图再次出现时它不重新加载collectionView,只有当我完全相当,并重新启动应用程序。为什么不reloadData()工作?

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 
} 

回答

0

看起来collectionView!.reloadData()已被调用(在viewWillAppear)之前grabPhotos()完成它的工作。

我建议通过增加两个断点,一个在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!") 
     } 
    } 
} 

希望这有助于。

0

看起来你用来填充你的集合视图的数据是在ViewDidLoad方法中创建的。该方法只在第一次显示此View Controller时被调用,与ViewWillAppear方法不同,ViewWillAppear方法每次显示View Controller时都会调用该方法。因此,即使每次呈现视图控制器时collectionView都尝试重新加载数据,数据也不会改变。为了获得新数据,您需要将刷新数据的代码(grabPhotos方法)移动到ViewWillAppear方法。

+0

我已经尝试在ViewWillAppear中添加grabPhotos()方法,但随后它会抓取每次出现视图并复制它们的照片。所以说这张专辑里有10张照片,每次出现的视图都会翻倍。 –

+0

而不是将这些元素附加到imageArray您应该重置imageArray等于新的结果。 –

+0

谢谢托马斯,我是一个完整的初学者,但会试着研究你所说的话并想出一些东西。不完全知道如何去执行你的建议 –