Ошибка с UIAlert и View Controller - PullRequest
0 голосов
/ 06 ноября 2018

У меня очень странная ошибка со значением по умолчанию Alert в моем приложении для iOS для iPad.

На нем у меня есть три кнопки: одна для камеры, вторая для фотогалереи и третья кнопка для отклонения. Оповещение используется для выбора фотографий. Иногда у меня возникает проблема, когда я нажимаю на кнопку «отклонить» в этом предупреждении, выполняется следующий тип кода:

let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginPageViewController

Я не уверен, что это именно тот код, который выполняется, но он выполняет действие по выходу из системы, и пользователи перенаправляются на экран входа в систему.

Вот мой код для Alert

func showPopover(uiView: UIView) {
        let alertController = UIAlertController(title: nil, message: "Choose Photos", preferredStyle: .actionSheet)

        let defaultAction = UIAlertAction(title: "Camera", style: .default, handler: { (alert: UIAlertAction!) -> Void in
            self.view?.pickPhotoFromCamera()
        })

        let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler: { (alert: UIAlertAction!) -> Void in
            self.view?.pickPhotoFromLibrary()
        })

        let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: { (alert: UIAlertAction!) -> Void in
            (self.view as? UIViewController)?.dismiss(animated: true, completion: nil)
        })

        alertController.addAction(defaultAction)
        alertController.addAction(galleryAction)
        alertController.addAction(cancelAction)

        if let popoverController = alertController.popoverPresentationController {
            popoverController.sourceView = uiView
            popoverController.sourceRect = CGRect(x: uiView.bounds.midX, y: uiView.bounds.midY, width: 0, height: 0)
            popoverController.permittedArrowDirections = []
        }
        (view as? UIViewController)?.tabBarController!.present(alertController, animated: true, completion: nil)
    }

Как вы видите, мой код в предупреждении не выполняет никаких действий по выходу из системы, но иногда такое случается. Может быть, у кого-то были похожие проблемы? Что может быть причиной этого?

Если вам нужна дополнительная информация - дайте мне знать. Заранее спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Проблема в cancelAction, которая закрывает текущий вид контроллера. установить его стиль для отмены без обработчика.

let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
0 голосов
/ 06 ноября 2018

Во-первых, вам не нужно писать код для кнопки действия типа .cancel, чтобы закрыть представленный контроллер представления предупреждений. Во-вторых, вы можете просто использовать view для представления контроллера предупреждений, не нужно запрашивать его у родителя (tabBarController). Ваш код в кнопке .cancel отклоняет сам контроллер входа в систему.

import UIKit

class LoginViewController: UIViewController {

  func showPopover(uiView: UIView) {

    let alertController = UIAlertController(title: nil, message: "Choose Photos", preferredStyle: .actionSheet)


    let defaultAction = UIAlertAction(title: "Camera", style: .default, handler: { (alert: UIAlertAction!) -> Void in
      self.pickPhotoFromCamera()
    })

    let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler: { (alert: UIAlertAction!) -> Void in
      self.pickPhotoFromLibrary()
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

    alertController.addAction(defaultAction)
    alertController.addAction(galleryAction)
    alertController.addAction(cancelAction)

    if let popoverController = alertController.popoverPresentationController {
      popoverController.sourceView = uiView
      popoverController.sourceRect = uiView.bounds
    }

    present(alertController, animated: true, completion: nil)

  }

  private func pickPhotoFromCamera() { }
  private func pickPhotoFromLibrary() { }

}
0 голосов
/ 06 ноября 2018

попробуй

let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
...