私は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
}
私は、ViewWillAppearにgrabPhotos()メソッドを追加しようとしましたが、ビューが現れるたびに写真をつかみ、それらを複製します。だから、アルバムに10枚の写真があると、ビューが倍増するたびに表示されます。 –
これらの要素をimageArrayに追加するのではなく、imageArrayをリセットして新しい結果と同じにする必要があります。 –
ありがとうThomas、私は完全な初心者ですが、あなたが言ったことを見て、何かを理解しようとします。 –