在 iOS14 過後當我們需要從相簿選擇照片時會改用 PHPickerViewController 來協助選擇,並且可以發現當我們第一次選擇一張或是多張照片後,再次開啟 PHPickerViewController 會沒有上次選擇的紀錄。

這樣容易導致使用者重複選擇相同照片,同時也不太直覺,會感覺明明那些照片已經選過了,但是有沒有被標記成以選擇的狀態。

第一步: 設定 PHPickerConfiguration

我們可以透過 PHPickerConfiguration 當中的 preselectedAssetIdentifiers 來讓 PHPicker 知道哪些照片是已經被選擇的,具體來說會像是以下。

var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
config.filter = .images
config.selectionLimit = 0
config.preselectedAssetIdentifiers = selectedImagesId
let pickerVC = PHPickerViewController(configuration: config)
pickerVC.delegate = self
return pickerVC

PHPickerConfiguration

以上程式碼有兩個重點
1. 在創建 PHPickerConfiguration 時我們需要帶入 photoLibrary 資訊,這是為了等到使用者選擇完照片後可以知道該照片的 assetIdentifier 所準備的。
2. 在 config 中設定 preselectedAssetIdentifiers,並且設定的值會是已經選擇的照片的 assetIdentifier,他會是一個 [String] 的格式。

第二步: 獲取選擇圖片的 AssetIdentifier

在 PHPickerViewControllerDelegate 中我們可以獲取到使用者最終選取的照片資訊,那解析的方法如下。

func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    var newSelectedIds = results.compactMap { $0.assetIdentifier }
}

這樣就可以很簡單的獲取到照片的 assetIdentifier。

以上就是本次想要分享的內容,感謝各位~