【问题标题】:update/reload collection view after deleting item from UICollectionView从 UICollectionView 删除项目后更新/重新加载集合视图
【发布时间】:2016-11-28 14:30:10
【问题描述】:

我为我的应用使用了照片集合视图。 我已经轻松地从集合视图中删除了项目,但它不会立即从集合视图中删除项目。如果我转到另一个视图控制器并返回到集合视图控制器,那么它会被更新并从集合视图中删除已删除的项目。我希望在删除操作发生时立即更新集合视图。我怎么解决这个问题?提前致谢。 我的快速代码如下:

import UIKit
import Photos

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate{

var assetCollection: PHAssetCollection = PHAssetCollection()
var photosAsset: PHFetchResult!
var assetThumbnailSize:CGSize!
var selectedIndexPath = [NSIndexPath]()

@IBAction func deleteButton(sender: UIButton) {

    if selectedIndexPath.count != 0{

                PHPhotoLibrary.sharedPhotoLibrary().performChanges({
                    //Delete Photo
                    if let request = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection){
                        for a in self.selectedIndexPath{
                        request.removeAssets([self.photosAsset[a.item]])

                    }
                    }
                    }, completionHandler: nil)}


                self.collectionView.reloadData()
}

这是我的 viewWillAppear 方法:

override func viewWillAppear(animated: Bool) {

    // Get size of the collectionView cell for thumbnail image
    if let layout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout{
        let cellSize = layout.itemSize
        self.assetThumbnailSize = CGSizeMake(cellSize.width, cellSize.height)
    }

    self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)


    if let photoCnt = self.photosAsset?.count{
        if(photoCnt == 0){
            self.noPhotosLabel.hidden = false
        }else{
            self.noPhotosLabel.hidden = true
        }
    }

    self.collectionView.reloadData()

}

【问题讨论】:

    标签: swift uicollectionview


    【解决方案1】:

    您需要在完成处理程序中添加 reload 方法。

        PHPhotoLibrary.sharedPhotoLibrary().performChanges({
                    //Delete Photo
                    if let request = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection){
                        for a in self.selectedIndexPath{
                        request.removeAssets([self.photosAsset[a.item]])
    
                    }
                    }
                    }, completionHandler: { _ in  
      self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)
      dispatch_async(dispatch_get_main_queue(), { self.collectionView.reloadData() }) 
      })
    

    【讨论】:

    • 我按照你的建议试过了,但还是不行。我面临着与我在问题中解释的相同的问题。如果您能给我更多建议,我将不胜感激。谢谢。
    • 好的。它可能不会更新,因为一个或两个集合视图数据源方法不是动态的。您能否在完成处理程序中添加 self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil) 后跟 self.collectionView.reloadData() 并让我知道它是否有所改进。我已经用这个想法更新了我的解决方案。
    • 它可以工作,但删除和更新集合视图需要很长时间,大约需要 10-15 秒。它显示警告,例如“此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常”并且还显示“0 CoreFoundation 0x24d7b933 + 150 1 libobjc.A.dylib 0x24516e17 objc_exception_throw + 38 2 CoreFoundation 0x24d7b861 + 0 3 Foundation 0x2566d3e7 + 170 " 类型。请提供您的进一步建议以解决此问题
    • 好的。据说因为 collectionview.reloadData 应该在主线程而不是后台线程上完成。将 self.collectionView.reloadData() 包装在 DispatchQueue.main.async { self.collectionView.reloadData() } 这样的调度队列中,让我知道这是否有效。
    • 它显示一个错误,例如“使用未解析的标识符''DispatchQueue”
    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多