ios - 如何刷新collectionView
问题描述
我的问题是,当我将图片保存到照片库时,我的 collectionView 没有更新。如果我点击第一张图片,它会打开我最近保存的图片,但视觉上 collectionView 永远不会更新。我认为 reloadData() 以这种方式工作,但我想不是。
当应用程序加载时,用户从 collectionView(iPhone 照片库)中选择照片,然后将其发送到另一个视图,在那里他编辑图片,然后将其保存到库中,并使用展开转场返回到第一个视图。
我的代码:
class pickerViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
var activityIndicator:UIActivityIndicatorView = UIActivityIndicatorView()
var imageArray = [UIImage]()
override func viewDidLoad() {
mygtukasMenu.layer.cornerRadius = 10
mygtukasMenu.clipsToBounds = true
grabPhotos()
kolekcija.reloadData()
}
@IBOutlet weak var kolekcija: UICollectionView!
func grabPhotos(){
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = false
requestOptions.deliveryMode = .opportunistic // Quality of images
requestOptions.isNetworkAccessAllowed = true
requestOptions.isSynchronous = true
requestOptions.progressHandler = { (progress, error, stop, info) in
print("progress: \(progress)")
}
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) {
if fetchResult.count > 0 {
for i in 0..<fetchResult.count {
imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: {
image, error in
self.imageArray.append(image!)
})
}
}
else {
print("You got no photos")
kolekcija.reloadData()
}
}
kolekcija.reloadData() // UPDATED
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
grabPhotos()
kolekcija.reloadData() // UPDATED
}
}
解决方案
当您在块中的 func grabPhotos() 获取图片时,您需要调用 reloadData()
imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: {
image, error in
self.imageArray.append(image!)
self.kolekcija.reloadData() <<<<< HERE RELOAD CALL NEED
})
当你打电话时
override func viewDidLoad() {
mygtukasMenu.layer.cornerRadius = 10
mygtukasMenu.clipsToBounds = true
grabPhotos() <<< photos still grabbing at async mode
kolekcija.reloadData() <<< there is no images grabbed... it still grabbing at async mode when u call reload func here.....
}
推荐阅读
- sql - 两个查询及其总和的差异
- machine-learning - 如何在 pytorch 基本示例中包含批量大小?
- apache-kafka - 首次启动的 Kafka 服务器和领导者故障阻塞消费者
- python - 在 Scikit-learn 的 LDA 实现中,“困惑度”(或“分数”)应该上升还是下降?
- macos - QtMac::toNSImage 架构 x86_64 的未定义符号
- php - MySQL 查询将相似视图汇总为一个结果视图
- javascript - 手风琴 - 打开另一项时关闭一项
- anaconda - Anaconda下的Pytorch安装问题
- firebase - 如何使用 Postman 通过 Firebase 身份验证测试 Google App Engine API?
- database - 同时检索和更新数据