2017-10-26 6 views
0

UITableで表示するために、フィルタを適用したsmartAlbumのコレクションを作成する必要があります。 フィルタリングされていないコレクションを変更可能なフォームにキャストし、除外したいものを削除した後、PHFetchResultにリキャストする方法については、これまでさまざまなアプローチを試みました。これらの試みはすべて失敗しました。フィルタリングされたアルバムのPHAssetCollectionの作成に失敗する

PHFetchオプションを使用して、特に許可された「localizedTitle」のキーでアルバムをフィルタリングしようとしています(https://developer.apple.com/documentation/photos/phfetchoptions)。しかし、「Videos」スマートフォルダを除外しようとする次のテストケースコードを試してみると、newAlbumsでゼロカウントの結果が得られます。また、述語を%K ==%@に設定すると、結果はゼロになります。正しい答えは、前者では15、後者では1であったはずです。なぜ私の述語が適切な結果を選択できないのですか?新しいコレクションをライブラリに保存し直して一時的に表示するのではなく、リクエストの呼び出しを試していませんでしたか?

S/Oとdeveloperを検索しました.appleと作業コードの唯一の例は、スマートアルバムを選択するのではなく、個々のメディア(写真やビデオ)をフィルタリングするためのものです。

let fetchOptions = PHFetchOptions() 
    let p1 = NSPredicate(format: "%K == %@", "localizedTitle", "Videos") 
    fetchOptions.predicate = p1 
    let newAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: fetchOptions) 
+0

は、誰もが一時コレクションを使用していますこのような結果を達成するには?一時的なコレクションは、通常の結果のコレクションのように不変であるため、結果として必要なコレクションを構築する方法はわかりません。 – BlueskyMed

答えて

0

ここでは、私が働くことを確認したアプローチがあります。マイケルに感謝します。https://stackoverflow.com/a/46145638/4945371

最初にこの小さなメソッドを追加して、PHCollectionListではなく配列を返します。

private func fetchSmartCollections(with: PHAssetCollectionType, subtypes: [PHAssetCollectionSubtype]) -> [PHAssetCollection] { 
    var collections:[PHAssetCollection] = [] 
    let options = PHFetchOptions() 
    options.includeHiddenAssets = false 

    for subtype in subtypes { 
     if let collection = PHAssetCollection.fetchAssetCollections(with: with, subtype: subtype, options: options).firstObject { 
      collections.append(collection) 
     } 
    } 
    return collections 
} 

次に、目的のスマートアルバムの配列を作成します。

let subtypes:[PHAssetCollectionSubtype] = [ 
     .smartAlbumFavorites, 
     .smartAlbumLongExposures, 
     .smartAlbumSelfPortraits, 
     .smartAlbumRecentlyAdded 
     // .smartAlbumUserLibrary, 
     // .smartAlbumPanoramas, 
     // .smartAlbumLivePhotos, 
     // .smartAlbumBursts, 
     // .smartAlbumDepthEffect, 
     // .smartAlbumScreenshots, 
    ] 

は最後に、代わりのいくつかの変種の

 smartAlbumsArray = fetchSmartCollections(with: .smartAlbum, subtypes: subtypes) 

smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: smartAlbumOptions) 
関連する問題