👻
[iOS] PHPickerViewControllerの不思議な挙動
次のように、一度取得したassetIdentifierをpreselectedAssetIdentifiersに指定してPHPickerViewControllerを表示する実装があります。
func presentPicker() {
var configuration = PHPickerConfiguration(photoLibrary: .shared())
configuration.preselectedAssetIdentifiers = [id]
let vc = PHPickerViewController(configuration: configuration)
vc.delegate = self
present(vc, animated: true)
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
dismiss(animated: true)
id = results[0].assetIdentifier!
print(results[0].itemProvider)
}
これを実行すると、次のようなItemProviderを得ることができます。
<PUPhotosFileProviderItemProvider: 0x600003005290> {types = (
"public.jpeg",
"com.apple.private.photos.thumbnail.standard",
"com.apple.private.photos.thumbnail.low"
)}
しかし、preselectedAssetIdentifiersが指定された2回目の実行時は次のようにtypesが空になった状態のItemProviderが得られます。
<PUPhotosFileProviderItemProvider: 0x600003019200> {types = (
)}
preselectedAssetIdentifiersを指定する場合は、前回取得したItemProviderをキャッシュして使い回す必要がありそうです。
なお、preselectedAssetIdentifiersを指定していない場合は、2回目以降もitemProviderが取得できます。
Results don’t include item providers for preselected assets that remain selected.
Discussion