Предупреждение «Сохраненная фотография» появляется, прежде чем пользователь разрешит доступ к библиотеке фотографий? - PullRequest
0 голосов
/ 20 февраля 2019

Когда пользователь нажимает кнопку, он сразу же запускает предупреждение «Фотография была сохранена», прежде чем запрашивать у пользователя разрешение.Если пользователь нажимает «нет», фотография не будет сохранена, но предупреждение все равно будет отображаться.Можно ли использовать оператор if else, чтобы сделать его таким, чтобы не появлялось предупреждение, пока пользователь не разрешил доступ к библиотеке фотографий?

@IBAction func savePhotoClicked(_ sender: Any) {


    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)


    let alert = UIAlertController(title: "Saved!", message: "This wallpaper has been saved.", preferredStyle: .alert)
    let okAction = UIAlertAction(title: "Ok", style: .default, handler: nil)
    alert.addAction(okAction)
    self.present(alert, animated: true, completion: nil)


}

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Вы показываете свой контроллер предупреждений слишком рано.Вызов UIImageWriteToSavedPhotosAlbum является асинхронным.Посмотреть все эти nil значения, которые вы передаете во 2-й, 3-й и 4-й параметры?Замените их правильными значениями, чтобы вы могли вызывать оповещение, когда вызов на UIImageWriteToSavedPhotosAlbum фактически завершается, и вы можете правильно определить, действительно ли изображение было сохранено или нет.

@IBAction func savePhotoClicked(_ sender: Any) {
    UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
}

@objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
    if let error = error {
        // show error
    } else {
        let alert = UIAlertController(title: "Saved!", message: "This wallpaper has been saved.", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "Ok", style: .default, handler: nil)
        alert.addAction(okAction)
        self.present(alert, animated: true, completion: nil)
    }
}
0 голосов
/ 20 февраля 2019

Обычно:

  • Либо вам не нужно получать уведомление о завершении записи изображения (во многих случаях это бесполезно), поэтому вы используете nil для обоих параметров
  • Или вы действительно хотите получать уведомление, когда файл изображения был записан в фотоальбом (или в результате возникла ошибка записи), и в этом случае вы обычно реализуете обратный вызов (= метод для вызова)завершение) в том же классе, из которого вы вызывали функцию UIImageWriteToSavedPhotosAlbum, поэтому completionTarget обычно будет self

Как указано в документации, completionSelector является селектором, представляющимметод с сигнатурой описан в документации, поэтому он должен иметь такую ​​сигнатуру, как:

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo: (void *) contextInfo;

Ему не обязательно иметь это точное имя, но он должен использовать ту же сигнатуру, а именно принимать 3 параметра(первый - UIImage, второй - NSError, а третий - void*) и ничего не возвращают (void).


Пример

Вы можете, например, Declесть и реализуйте метод, который вы могли бы вызывать как угодно:

- (void)thisImage:(UIImage *)image hasBeenSavedInPhotoAlbumWithError:(NSError *)error usingContextInfo:(void*)ctxInfo {
    if (error) {
        // Do anything needed to handle the error or display it to the user
    } else {
        // .... do anything you want here to handle
        // .... when the image has been saved in the photo album
    }
}

А когда вы вызываете UIImageWriteToSavedPhotosAlbum, вы будете использовать его следующим образом:

UIImageWriteToSavedPhotosAlbum(theImage,
   self, // send the message to 'self' when calling the callback
   @selector(thisImage:hasBeenSavedInPhotoAlbumWithError:usingContextInfo:), // the selector to tell the method to call on completion
   NULL); // you generally won't need a contextInfo here

Примечание кратное ':' в синтаксисе @selector(...).Двоеточие является частью имени метода, поэтому не забудьте добавить эти ':' в @ селектор (если он обучающий) при написании этой строки!

0 голосов
/ 20 февраля 2019

Давайте проверим значение +authorizationStatus (класс PHPhotoLibrary), прежде чем что-либо делать.И вы также можете запросить доступ к библиотеке фотографий, используя метод +requestAuthorization, если статус PHAuthorizationStatus.notDetermined

Дополнительная информация: PHPhotoLibrary authorizationStatus , PHPhotoLibrary requestAuthorization

...