Поведение UIAlertView show() для UIAlertController
В предыдущих версиях iOS я смог вызвать show
в UIAlertView в App Delegate. Более конкретно, show
вызывается в:
func applicationDidBecomeActive(application: UIApplication)
Так как UIAlertView
в большинстве случаев не учитывал иерархию представлений, это решение работало независимо от того, где пользователь находился в приложении.
С введением UIAlertController
эта проблема становится немного сложнее. UIAlertController
теперь является подклассом UIViewController
и должен быть представлен точно так же, как любой другой UIViewController. Представляя UIAlertController из keyWindow, rootViewController работает, это не идеальное решение.
Есть ли у кого-нибудь идеи по репликации функциональности [UIAlertView show]
для UIAlertController
? Любой способ показать UIAlertController
в приложении активным без прохождения иерархии представлений?
Ответы
Ответ 1
Я понял, какое решение я считаю более элегантным, чем ответ, который я опубликовал ранее. Я скопирую и вставлю ответ, который я отправил в аналогичный вопрос. Следуйте ссылке внизу моего сообщения, если вы просто хотите увидеть код.
Решение заключается в использовании дополнительного интерфейса UIWindow.
Если вы хотите отобразить свой UIAlertController:
- Сделайте свое окно ключевым и видимым окном (
window.makeKeyAndVisible()
)
- Просто используйте простой экземпляр UIViewController в качестве rootViewController нового окна. (
window.rootViewController = UIViewController()
)
- Представьте свой UIAlertController на вашем окне rootViewController
Несколько замечаний:
- Ваш UIWindow должен быть строго привязан. Если он не будет сильно ссылаться, он никогда не появится (потому что он выпущен). Я рекомендую использовать свойство, но у меня также был успех с связанным объектом.
- Чтобы окно выглядело над всем остальным (включая системные UIAlertControllers), я устанавливаю windowLevel. (
window.windowLevel = UIWindowLevelAlert + 1
)
Наконец, у меня есть завершенная реализация, если вы просто хотите посмотреть на это.
https://github.com/dbettermann/DBAlertController
Ответ 2
Вот что я закончил с:
public class func visibleViewController() -> UIViewController? {
return self.visibleViewController(UIApplication.sharedApplication().keyWindow?.rootViewController?)
}
private class func visibleViewController(viewController: UIViewController?) -> UIViewController? {
if viewController?.presentedViewController == nil {
println("Visible view controller: \(viewController)")
return viewController
} else if let navigationController = viewController as? UINavigationController {
return self.visibleViewController(navigationController.topViewController)
} else if let tabBarController = viewController as? UITabBarController {
return self.visibleViewController(tabBarController.selectedViewController)
} else {
return self.visibleViewController(viewController?.presentedViewController)
}
}
Ответ 3
Попробуйте это
UIAlertController * alert= [UIAlertController
alertControllerWithTitle:@"title"
message:@" Your message hear"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okBtnAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
//Do what action u want.
[alert dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:okAction];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
[alert dismissViewControllerAnimated:YES completion:nil];
//do something when click button
}];
[alert addAction:Action];
UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
[vc presentViewController:alert animated:YES completion:nil];
Ответ 4
Попробуйте использовать JSAlertView, который обрабатывает API UIAlertView и UIAlertController.
Он предоставляет короткие и легкие методы для отображения предупреждений и обработки нескольких предупреждений, выпущенных в одно и то же время, очень хорошо.