63768
UIImagePickerControllerでライブラリから画像を取得、画像を選択して表示(ここまでは、なんとか出来ました)して、  
その画像をライブラリから削除する方法はあるのでしょうか？。  
ネット等で色々調べましたが、fetchAssets(withALAssetURLs:options:)はDeprecatedだし…。  
全く良くわかりませんでした。

```

    let fetchOptions = PHFetchOptions()
    
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
    
        let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
    
        if (fetchResult.lastObject != nil) {
    
            let lastAsset: PHAsset = fetchResult.lastObject!
    
            let delAsset = NSArray(object: lastAsset)
    
            PHPhotoLibrary.shared().performChanges( {
                PHAssetChangeRequest.deleteAssets(delAsset)
            },completionHandler: completion)
    
```

ここまでは、何とかググってたどり着きましたが、これだと画像の最後の一枚からしか削除出来ません。選択した任意の画像を削除するには、どのようにしたら良いのでしょうか？。  
ご教授、よろしくお願いいたします。
CC BY-SA 4.0
2020-03-11T02:56:35.793
63751
2020-03-12T01:14:54.343
2020-03-11T08:57:55.820
38167
38167
question
swift xcode
UIImagePickerControllerで取得し選択した画像の削除についての質問です。
`PHPhotoLibrary`クラスを使用した写真ライブラリの操作を行う場合、操作対象となる`PHAsset`オブジェクトを取得しないといけません。

あなたが掲載されたコードの前半では、写真ライブラリを作成日順に並べた最後の`PHAsset`オブジェクトを取得していますから、当然最後の一枚が削除されることになります。

`UIImagePickerController`を使って写真を選択する場合、選択した写真の`PHAsset`オブジェクトは、`imagePickerController(_:didFinishPickingMediaWithInfo:)`に渡される`info`から取り出すことができます。それをインスタンス変数(以下の例では`selectedAsset`)に保持しておきます。

```

        private var selectedAsset: PHAsset?
    
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            print(info)
            if let image = info[.originalImage] as? UIImage {
                imageView.image = image
                if let asset = info[.phAsset] as? PHAsset { //<- 選択された写真のPHAssetオブジェクト
                    selectedAsset = asset
                    deleteSelectedImageButton.isEnabled = true
                } else {
                    selectedAsset = nil
                    deleteSelectedImageButton.isEnabled = false
                }
            }
            picker.dismiss(animated: true, completion: nil)
        }
    
```

ただし、`info[.phAsset]`が確実に取得できるようにするためには、事前に写真ライブラリにアクセスする許可をユーザから認証してもらう必要があるようです。

```

        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            //...
            deleteSelectedImageButton.isEnabled = false
            //
            let status = PHPhotoLibrary.authorizationStatus()
    
            if status == .notDetermined  {
                PHPhotoLibrary.requestAuthorization {status in
                    print(status)
                    if status != .authorized {
                        //PhotoLibrary使用の承認を促すメッセージなんかを表示する…
                    }
                }
            } else {
                //statusが.authorized以外なら
                //PhotoLibrary使用の承認を促すメッセージなんかを表示する…
            }
        }
    
```

これで写真を`UIImagePickerController`で選択したら、`selectedAsset`にその`PHAsset`オブジェクトがセットされているはずですから、それを使って削除の処理を行うだけです。

```

        @IBAction func deleteSelectedImage(_ sender: Any) {
            guard let asset = selectedAsset else {
                print("selectedAsset is nil")
                return
            }
            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.deleteAssets([asset] as NSArray)
            }) {success, error in
                print(success)
                if success {
                    DispatchQueue.main.async {
                        self.imageView.image = nil
                        self.selectedAsset = nil
                        self.deleteSelectedImageButton.isEnabled = false
                    }
                }
            }
        }
    
```

現在のあなたのコードがほとんど示されていないので、ご自身のアプリに組み込むにはあちこち手を入れないといけないかもしれませんが、基本的な処理の流れは説明させていただいたので、それほど困難ではないと思います。
CC BY-SA 4.0
2020-03-11T12:23:06.937
63768
2020-03-12T01:14:54.343
2020-03-12T01:14:54.343
13972
13972
63751
answer