使用照片框架从照片库中删除照片

Posted

技术标签:

【中文标题】使用照片框架从照片库中删除照片【英文标题】:Deleting photo from Photo Library using Photo framework 【发布时间】:2017-10-23 07:38:18 【问题描述】:

我正在编写一个相册应用程序,它可以访问用户照片库中的照片、添加过滤器和删除照片。我使用 Photo 框架删除了 PHAssetChangeRequest.deleteAssets(assetToDelete) 的资产。 这里的资产类别是PHAsset

// Delete the photo from library    
@IBAction func deleteBtnPressed(_ sender: Any) 
        let assetToDelete = self.asset
        if let assetToDelete = assetToDelete
          
            phphotoLibrary.shared().performChanges(
            PHAssetChangeRequest.deleteAssets(assetToDelete)
          )
        
      

但是这里发生错误,“参数类型'PHAsset'不符合预期的类型'NSFastEnumeration'”。

所以我按照 Xcode 的建议更改了assetToDelete 的类型:

PHAssetChangeRequest.deleteAssets(assetToDelete as! NSFastEnumeration)

还是不行,错误提示:

无法将“PHAsset”类型的值转换为“NSFastEnumeration”

有谁知道如何处理这个问题?谢谢!

【问题讨论】:

【参考方案1】:

线索在于名称“assets”复数 - API 需要一个数组或任何其他符合 NSFastEnumeration 的集合类型,例如 Set

PHAssetChangeRequest.deleteAssets([assetToDelete] as NSArray)

https://developer.apple.com/documentation/photos/phassetchangerequest/1624062-deleteassets

【讨论】:

声明:func delete(_ assets: [PHAsset]) ... PHAssetChangeRequest.deleteAssets(assets) ...。它给出了错误Argument type '[PHAsset]' does not conform to expected type 'NSFastEnumeration' 有趣。尝试投射as NSArray 是的,它适用于铸造。但是你提到的[assetToDelete]swift array,而不是NSArray @VyachaslavGerchicov 编译器“应该”自动将 Swift 数组连接到 NSArray。您使用的是 Xcode 11 吗?这可能是一个错误。 使用 NSArray,正如 Burton 先生的回答所说,对我有用。【参考方案2】:

更正确的方法是先从库中获取:

let assetIdentifiers = assetsToDeleteFromDevice.map( $0.localIdentifier )
let assets = PHAsset.fetchAssets(withLocalIdentifiers: assetIdentifiers, options: nil)
PHPhotoLibrary.shared().performChanges(
    PHAssetChangeRequest.deleteAssets(assets)
)

【讨论】:

以上是关于使用照片框架从照片库中删除照片的主要内容,如果未能解决你的问题,请参考以下文章

我如何使用目标 c 中的照片框架从图库中访问照片

如何从 iPhone 照片库中删除照片

从照片库中删除资产

如何在使用照片框架从照片中选择图像时在选择器中隐藏 iCloud 图像

照片框架工作异常。

使用照片框架按图片大小过滤照片库