2017-01-23 11 views
0

私は2つの異なるアプリケーションでUICollectionViewを使用しています。 1つはUICollectionViewが含まれ、もう1つは含まれません。 私は以下のコードでアプリケーションにビューが表示されるときに、reloadData()を使用してCollectionViewをリフレッシュすることができます。self.collectionView!または? 「UICollectionView unwrapped not」として表示され、ビューが再表示されたときに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()が完了したようです。

私は1つが最初に到達したチェックするために、2つのブレークポイントself.collectionView!.reloadData()ラインとself.imageArray.append(image!)ラインで他方に1を加えることによって、コードを実行するソートをデバッグする示唆する。次のように

は代わりにviewWillAppearself.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メソッドとは異なり、このView Controllerが初めて表示されたときに初めて呼び出されます。したがって、たとえコレクションビューが表示されるたびにcollectionViewがデータをリロードしようとしても、データは決して変更されません。新しいデータを取得するには、データをViewWillAppearメソッドにリフレッシュするコード(grabPhotosメソッド)を移動する必要があります。

+0

私は、ViewWillAppearにgrabPhotos()メソッドを追加しようとしましたが、ビューが現れるたびに写真をつかみ、それらを複製します。だから、アルバムに10枚の写真があると、ビューが倍増するたびに表示されます。 –

+0

これらの要素をimageArrayに追加するのではなく、imageArrayをリセットして新しい結果と同じにする必要があります。 –

+0

ありがとうThomas、私は完全な初心者ですが、あなたが言ったことを見て、何かを理解しようとします。 –

関連する問題