Отключение контроллера представления и представление контроллера предупреждений

В моем проекте я использую rootViewController? .Dismiss, чтобы отклонить некоторые контроллеры представления обратно в основной VC.

В обработчике завершения я хотел бы представить UIAlertController в главном контроллере представления, как только он снова станет видимым.

Моя проблема в том, что UIAlertController никогда не появляется. Я догадываюсь, что я использую self в параметре launchFrom. Нужно ли мне получить ссылку на основную ВК и представить ее там?

Закройте ВК и попробуйте представить оповещение:

self.view.window!.rootViewController?.dismiss(animated: false, completion: {
    Constants.presentThankYou(launchFrom: self)
})

Метод presentThankYou

static func presentThankYou(launchFrom: UIViewController) {
    let alertController = UIAlertController(title: "Thank You!", message: "You did it!", preferredStyle: UIAlertControllerStyle.alert)
    let okAction = UIAlertAction(title: "Close", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
        print("Done")
    }
    alertController.addAction(okAction)
    launchFrom.present(alertController, animated: true, completion: nil)
}

Как мне представить Контроллер предупреждений после того, как все мои венчурные каналы были уволены?


person Joe    schedule 18.12.2017    source источник
comment
Просто вызовите предупреждение в контроллере, которое станет parentView после того, как вы отклоните требуемый контроллер, используйте структуру bool, к которой можно получить глобальный доступ, и проверьте это значение bool и при необходимости покажите предупреждение   -  person iOS Geek    schedule 19.12.2017


Ответы (4)


Из головы попробуй сделать это за viewDidAppear. Чтобы предупреждение не отображалось все время, используйте логическое значение shouldShowThankYouAlert и установите для этого значения значение true в обработчике dismiss completion.

person Mugunth    schedule 18.12.2017

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

override func viewWillDisappear(_ animated: Bool) {
        if self.isMovingFromParentViewController {
            DispatchQueue.main.async {
                wrapperClass.BasicAlert("View is Dismissed", message: "", view: self)
            }
        }
    }

Это покажет предупреждение, когда представление будет закрыто полностью

person iOS Geek    schedule 19.12.2017

Я не проверял это, но как насчет использования окна вместо UIViewController.

self.view.window!.rootViewController?.dismiss(animated: false, completion: {
   Constants.presentThankYou()
})

static func presentThankYou() {
   let alertController = UIAlertController(title: "Thank You!", message: "You did it!", preferredStyle: UIAlertControllerStyle.alert)
   let okAction = UIAlertAction(title: "Close", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
       print("Done")
    }
   alertController.addAction(okAction)
   appDelegate.window.present(alertController, animated: true, completion: nil)
}
person Prabhjot Singh Gogana    schedule 19.12.2017

Итак, одна проблема: блок завершения не требует основного потока. Я предлагаю принудительно выполнить завершение для выполнения некоторого кода.

var topController: UIViewController? {
  if var temp = UIApplication.shared.keyWindow?.rootViewController {
    while let presentedViewController = temp.presentedViewController {
      temp = presentedViewController
    }
    return temp
  }
  return nil
}

self.view.window!.rootViewController?.dismiss(animated: false, completion: {
  DispatchQueue.main.async {
    guard let top = topController else { return }
    Constants.presentThankYou(launchFrom: top)
  }
})
person jnblanchard    schedule 19.12.2017
comment
@AndreaMugnaini Согласно моим тестам, self существует во многих случаях и, вероятно, будет хорошим ответом на этот вопрос. - person jnblanchard; 19.12.2017
comment
Я попытался воспроизвести сценарий Джо, описанный выше, и у меня возникает сбой в вашем предыдущем коде. Поскольку контроллер представления, который должен быть стержнем контроллера предупреждений, будет освобожден. Хотя в вашем случае это может сработать, я думаю, безопаснее не делать предположений о неизвестном presentedViewController - person Andrea Mugnaini; 19.12.2017
comment
эээ, вы делаете что-то не так, если у вас происходит сбой с первым ответом, который я отправил. Я сделал этот ответ фиктивным. - person jnblanchard; 19.12.2017
comment
Может быть. Но вы можете попробовать сами: откройте проект fresh new, выполните навигацию всего с двумя контроллерами представления, нажмите vc2 из vc1, вернитесь из vc2, посмотрите, что произойдет. Ваш код был следующим (поместите его в vc2): override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) self.view.window!.rootViewController?.dismiss(animated: false, completion: { DispatchQueue.main.async { ViewController2.presentThankYou(launchFrom: self) } }) } - person Andrea Mugnaini; 19.12.2017
comment
Конечно, это не сработает ... вы только что уволили тот самый vc - person jnblanchard; 19.12.2017
comment
Да, точно. Таким образом, ваше решение (которое я иногда использовал в прошлом) не будет работать во всех случаях. - person Andrea Mugnaini; 19.12.2017
comment
Да, я согласен с вами, мое решение не сработает, если вы его неправильно примените. Вот почему я обновил свой ответ. Спасибо. - person jnblanchard; 19.12.2017