2017-01-23 3 views
0

Ich verwende die UICollectionView in zwei verschiedenen Apps. Einer der UICollectionView ist enthalten, der andere nicht. Ich kann ReloadData() verwenden, um die CollectionView zu aktualisieren, wenn die Ansicht jedoch in der App mit Code unten angezeigt wird, besteht darauf, ich benutze Self.collectionView! .reloadData() mit einem! oder ? als "UICollectionView nicht unwrapped" und dann wird das collectionView nicht neu geladen, wenn die Ansicht wieder angezeigt wird, dann klappt das ganz und gar nicht und ich starte die App neu.Warum funktioniert reloadData() nicht?

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 
} 

Antwort

0

Es scheint, dass collectionView!.reloadData() aufgerufen wurde (in viewWillAppear), bevor grabPhotos() beendet es Job.

schlage ich vor, die Sortierung der Ausführung des Codes zu debuggen, indem zwei Unterbrechungspunkte, eine an der self.collectionView!.reloadData() Leitung und die andere an self.imageArray.append(image!) Linie zu überprüfen, welche einen ersten erreicht ist.

Statt self.collectionView!.reloadData() in viewWillAppear hinzuzufügen, könnte man es in grabPhotos() Methode hinzufügen möchten, nachdem sie imageArray anhängt Finishing wie folgt:

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!") 
     } 
    } 
} 

Hope this geholfen.

0

Es sieht so aus, als ob die Daten, die Sie zum Füllen Ihrer Sammlungsansicht verwenden, in der ViewDidLoad-Methode erstellt werden. Diese Methode wird nur aufgerufen, wenn dieser View Controller zum ersten Mal vorgestellt wird, im Gegensatz zur ViewWillAppear-Methode, die jedes Mal aufgerufen wird, wenn der View Controller angezeigt wird. Obwohl die CollectionView die Daten jedes Mal erneut zu laden versucht, wenn der Ansichtscontroller angezeigt wird, ändern sich die Daten nie. Um neue Daten zu erhalten, müssen Sie den Code (die Methode "grabPhotos") verschieben, der die Daten in die ViewWillAppear-Methode aktualisiert.

+0

Ich habe versucht, die Methode grabPhotos() in den ViewWillAppear einzufügen, aber dann werden die Fotos jedes Mal aufgenommen, wenn die Ansicht erscheint und dupliziert. Sagen wir also, es gibt 10 Fotos im Album, jedes Mal, wenn die Ansicht erscheint, verdoppelt es sich. –

+0

Anstatt diese Elemente an imageArray anzufügen, sollten Sie das imageArray auf die neuen Ergebnisse zurücksetzen. –

+0

Danke Thomas, ich bin ein absoluter Anfänger, werde aber versuchen, herauszufinden, was du gesagt hast und etwas herausfinden. Nicht ganz sicher, wie man über die Umsetzung, was Sie –

Verwandte Themen