Почему происходит сбой моего приложения при нажатии опции «Сохранить изображение» на UIActivityViewController? - PullRequest
0 голосов
/ 25 октября 2018

Итак, в контроллере просмотра 3D Touch у меня есть вычисленная переменная, в которой я устанавливаю действие UIPreviewAction:

override lazy var previewActionItems: [UIPreviewActionItem] = {

    let save = UIPreviewAction.init(title: "Share Image", style: UIPreviewAction.Style.default, handler: { (action, controller) in
        let renderer = UIGraphicsImageRenderer(size: self.view.bounds.size)
        let imageAux = renderer.image { ctx in
            self.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: true)
        }
        self.delegate!.shareImage(image: imageAux, url: self.data.url)
    })

    return [save]
}()

, а в контроллере делегата у меня есть этот метод для представления UIActivityViewController:

func shareImage(image: UIImage, url: String) {

    if let data = image.pngData() {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let filename = paths[0].appendingPathComponent(url)
        try? data.write(to: filename)
    }

    let activityViewController = UIActivityViewController(activityItems: [image] , applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view
    self.present(activityViewController, animated: true, completion: nil)
}

все работает отлично, я могу поделиться с любыми приложениями, и могу сохранить, используя File Explorer, но если я нажимаю «Сохранить изображение», приложение вылетает.Похоже, мне нужно разрешение галереи, но я не знаю, как реализовать его в UIPreviewAction, чтобы проверить, есть ли у меня разрешение или нет, так что, если я делаю это, он сохраняет, а если нет, то запрашивает разрешение.

1 Ответ

0 голосов
/ 25 октября 2018

Добавьте новые записи в ваш новый файл InfoPlist.strings.

<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME)</string>

<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME)</string>

удалите приложение из симулятора и запустите снова.

...