2017-01-23 12 views
0

Я использую UICollectionView в двух разных приложениях. Один UICollectionView содержится, другой нет. Я могу использовать reloadData() для обновления CollectionView, когда появляется представление, но в приложении с кодом ниже, он настаивает, что я использую self.collectionView !.reloadData() с помощью! или ? поскольку «UICollectionView не разворачивается», а затем он не перезагружает коллекциюView при повторном представлении, работает только тогда, я полностью полностью и повторно запускаю приложение.Почему не 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!), чтобы проверить, какой был достигнут первый.

Вместо добавления self.collectionView!.reloadData() в viewWillAppear, вы можете добавить его в grabPhotos() методе после окончания добавления к imageArray, следующим образом:

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, который вызывается каждый раз, когда представлен View Controller. Поэтому, несмотря на то, что collectionView пытается перезагрузить данные каждый раз, когда представлен контроллер представления, данные никогда не меняются. Чтобы получить новые данные, вам необходимо переместить код (метод grabPhotos), который обновляет данные до метода ViewWillAppear.

+0

Я попытался добавить метод grabPhotos() в ViewWillAppear, но затем он захватывает фотографии каждый раз, когда появляется представление и дублирует их. Так скажите, что в альбоме 10 фотографий, каждый раз, когда появляется представление, он удваивается. –

+0

Вместо добавления этих элементов в imageArray вы должны сбросить imageArray, чтобы они соответствовали новым результатам. –

+0

Спасибо Томас, я полный новичок, но попробую посмотреть, что вы сказали, и что-то выяснить. Не совсем уверен, как идти о реализации того, что вы предлагаете –