我目前正在开发一个应用程序,我需要在每个相册的手机上显示本地存储的图像。我已经成功地显示了所有的相册名称,现在当选择一个相册时,我想要显示这些图像。
func getLocalAlbums() {
var albums: [AlbumModel] = [AlbumModel]()
albumNamesDevice.removeAll()
let options = PHFetchOptions()
let topLvlOptions = PHFetchOptions()
let userAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumUserLibrary, options: options)
let topLvlCollection = PHCollectionList.fetchTopLevelUserCollectionsWithOptions(topLvlOptions)
let allAlbums = [topLvlCollection, userAlbums]
for i in 0 ..< allAlbums.count {
let result = allAlbums[i]
result.enumerateObjectsUsingBlock { (asset, index, stop) in
if asset is PHAssetCollection {
let ass: PHAssetCollection = asset as! PHAssetCollection
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)
let newAlbum = AlbumModel(name: ass.localizedTitle!, count: ass.estimatedAssetCount, collection: ass)
albums.append(newAlbum)
}
}
}
for item in albums {
self.albumNamesDevice.append(item.name)
}
}
func getAssetsFromAlbum(albumName: String) -> [PHAsset] {
let options = PHFetchOptions()
// Bug from Apple since 9.1, use workaround
options.predicate = NSPredicate(format: "title = %@", albumName)
options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: true) ]
let results = PHAsset.fetchAssetsWithMediaType(.Image, options: options)
var assets = [PHAsset]()
results.enumerateObjectsUsingBlock { (obj, index, stop) in
if let asset = obj as? PHAsset {
assets.append(asset)
}
}
return assets
}问题是下面一行:
options.predicate = NSPredicate(format: "title = %@", albumName)我不断地发现错误:
由于“NSInvalidArgumentException”异常终止应用程序,原因:“获取选项中不支持谓词:标题==”“测试”
我在2014年就读到过,这是一个bug,但这怎么可能还没有被Apple devs解决呢?
有人知道这方面的工作吗?
发布于 2016-09-16 14:36:24
最后,我找到了答案,或者至少找到了一个解决办法。
func getAssetsFromAlbum(albumName: String) -> [PHAsset] {
let options = PHFetchOptions()
// Bug from Apple since 9.1, use workaround
//options.predicate = NSPredicate(format: "title = %@", albumName)
options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: true) ]
let collection: PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: nil)
for k in 0 ..< collection.count {
let obj:AnyObject! = collection.objectAtIndex(k)
if obj.title == albumName {
if let assCollection = obj as? PHAssetCollection {
let results = PHAsset.fetchAssetsInAssetCollection(assCollection, options: options)
var assets = [PHAsset]()
results.enumerateObjectsUsingBlock { (obj, index, stop) in
if let asset = obj as? PHAsset {
assets.append(asset)
}
}
return assets
}
}
}
return [PHAsset]()
}https://stackoverflow.com/questions/39385644
复制相似问题