PHPickerViewController 的取消按钮在 iOS 15 中不起作用

Kri*_*s2k 4 uikit ios swift phpickerviewcontroller ios15

我用于PHPickerViewController在 iOS 15 中选择用于用户个人资料图片目的的图像。我正在使用 UIKit 框架。我有以下代码:

var pickerConfig = PHPickerConfiguration(photoLibrary: .shared())
pickerConfig.selectionLimit = 1
pickerConfig.filter = .images
let pickerView = PHPickerViewController(configuration: pickerConfig)
pickerView.delegate = self
self.present(pickerView, animated: true)
Run Code Online (Sandbox Code Playgroud)

选择器工作正常,可以选择图像并委派结果。但是,当Cancel按下按钮时,没有任何反应,选择器也没有按预期关闭。

当按下实例PHPickerViewController自己的按钮时如何关闭实例?Cancel

编辑:

Method的实现PHPickerViewControllerDelegate如下:

func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult])
    {
        results.first?.itemProvider.loadObject(ofClass: UIImage.self) { [unowned self] reading , error in
            guard let image = reading as? UIImage, error == nil else
            {
                DispatchQueue.main.async {
                    picker.dismiss(animated: true)
                    self.profilePictureHasError = true
                    self.toggleDoneButtonEnabled()
                }
                return
            }
            self.profilePictureHasError = false
            DispatchQueue.main.async {
                picker.dismiss(animated: true)
                self.profilePictureHasChanged = self.userProfilePicture != image
                if self.profilePictureHasChanged
                {
                    self.profilePictureView.image = image
                    self.toggleDoneButtonEnabled()
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 8

您需要在picker(_:didFinishPicking:)委托方法中自行关闭选择器,该方法在用户完成选择点击取消按钮时调用。

\n

来自苹果文档picker(_:didFinishPicking:)

\n
\n

调用此方法后,系统不会自动关闭选择器。

\n
\n

例如:

\n
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {\n    // Do something with the results here\n    picker.dismiss(animated: true)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您当前的委托代码仅picker.dismiss在结果数组非空时(即用户选择了图像时)调用。当点击取消按钮时,将使用空结果数组调用委托方法。

\n

通过将以下内容添加到委托方法中的代码顶部来修复此问题:

\n
if results.isEmpty {\n    picker.dismiss(animated: true)\n    return\n}\n
Run Code Online (Sandbox Code Playgroud)\n