UIAlertController не в иерархии в другой точке входа - PullRequest
0 голосов
/ 05 марта 2019

У меня есть приложение, которое люди могут использовать для запроса сервиса.У меня есть контроллер панели вкладок, который использует контроллер навигации на 1-й вкладке, на которой было несколько страниц для разных вещей, таких как сервис, местоположение и информация о клиенте.У всех есть UIAlertViews, и все прекрасно работает, когда я ставлю tabBarController в качестве точки входа приложений.Затем я решил добавить другой UIViewController, чтобы они могли выбрать tabBarController или другой tabBarController.вроде 2 приложения в одном, если это имеет смысл.Когда я помещаю этот UIViewController в качестве точки входа в приложение, все UIAlertViews работают, за исключением последнего.Там написано: «Предупреждение: попытайтесь представить, чье представление не находится в иерархии окон!».Вот мой код

@IBAction func send(_ sender: Any)
{

    name.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    year.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    make.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    model.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    color.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    note.resignFirstResponder()
    dismiss(animated: true, completion: nil)

    let alertController = UIAlertController(title: "You will now email your service request. The recipient email adress and message will be preset, all you have to do is hit send.", message: "Message and data rates may apply.", preferredStyle: .alert)
    let okAction = UIAlertAction(title: "ok", style: UIAlertActionStyle.default)
    {
        UIAlertAction in
        let mailcomposedViewController = self.configureMailController()
        if MFMailComposeViewController.canSendMail()
        {
            self.present(mailcomposedViewController, animated: true, completion: nil)
        }
        else
        {
            self.showMailError()
        }
    }

    alertController.addAction(okAction)


    self.present(alertController, animated: true, completion: nil)
}

Может ли кто-нибудь указать мне правильное направление, почему оповещение работает на одной точке входа, а не на другой?

enter image description here

enter image description here

Когда я помещаю точку входа приложения в контроллер панели вкладок (верхнее изображение), все работает отлично.Но когда я ставлю точку входа как UIView (нижний рисунок), только последняя часть не работает.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Проблема в этой строке:

dismiss(animated: true, completion: nil)

Вы говорите это снова и снова (без причины).Вы (self) являетесь представленным контроллером представления, поэтому теперь вы исключаете себя .Таким образом, когда вы говорите self.present, вы больше не находитесь в иерархии представлений.

0 голосов
/ 05 марта 2019

Используйте этот код:

    let yourCurrentVisibleViewController = UIApplication.shared.keyWindow!.rootViewController

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

Или сделайте ваш контроллер субконтроллером из yourCurrentVisibleViewController выше.Возможно, вы пытаетесь вызвать метод до того, как ваш контроллер не появился.

...