Вы можете найти Top Most View Controller, используя эту функцию.
func topViewController(_ base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
if let nav = base as? UINavigationController {
return topViewController(nav.visibleViewController)
}
if let tab = base as? UITabBarController {
if let selected = tab.selectedViewController {
return topViewController(selected)
}
}
if let presented = base?.presentedViewController {
return topViewController(presented)
}
return base
}
Подавать UIAlertController
Используя этот метод через. например,
topViewController()?.present(alertController, animated: true, completion: nil)
Информация о методе: topViewController()
найти вершину. Самый представленный контроллер представления, UIAlertController
класс ужина - UIViewController
.
first UIAlertController
открыто нормально в верхнем представленном контроллере представления, попробуйте открыть второй UIAlertController
, затем topViewController()
, учитывая первое предупреждение. поэтому никакие UIAlertController
не пропустили.
Ниже приведен метод, показывающий несколько предупреждений:
UIAlertController *av = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction
actionWithTitle:kAlertOk
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
}];
[av addAction:cancelAction];
UIWindow *alertWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
alertWindow.rootViewController = [[UIViewController alloc]init];
alertWindow.windowLevel = UIWindowLevelAlert + 1;
[alertWindow makeKeyAndVisible];
[alertWindow.rootViewController presentViewController:av animated:YES completion:nil];
Быстрая версия для ответа @ Bejibun выше:
let alertView = UIAlertController(title: "New Message", message: "Message Body", preferredStyle: .Alert)
alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (UIAlertAction) in
alertView.dismissViewControllerAnimated(true, completion: nil)
}))
let alertWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
alertWindow.rootViewController = UIViewController()
alertWindow.windowLevel = UIWindowLevelAlert + 1
alertWindow.makeKeyAndVisible()
alertWindow.rootViewController?.presentViewController(alertView, animated: true, completion: nil)
Вы можете отслеживать список предупреждений, отображаемых в контроллере представления в качестве переменной экземпляра, например
NSMutableArray *alertsToShow;
. Вы можете представить первый UIAlertController и добавить UIAlertAction, в котором вы представляете следующее предупреждение (если применимо) с рекурсивным методом:
- (void)showAlertIfNecessary {
if (alertsToShow.count == 0)
return;
NSString *alert = alertsToShow[0];
[alertsToShow removeObjectAtIndex:0];
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:@"Title"
message:alert
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action)
{
[self showAlertIfNecessary];
}];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
Обратите внимание, что это может очень раздражать пользователя, если ему нужно щелкнуть по большому количеству сообщений. Вы можете рассмотреть возможность объединения их в одно сообщение.
Вы можете использовать JSAlertView , который обрабатывает как API UIAlertView, так и UIAlertController API.
Он обрабатывает несколько предупреждений, выпущенных в одно и то же время, очень хорошо. Он также предоставляет супер простые методы для отображения простых предупреждений.
Я думаю, что я очень опаздываю на это, но все равно публикую, поскольку это может быть полезно для кого-то, кто ищет это, хотя Apple не рекомендует многократные оповещения, поэтому они отказались от этого UIAlertView от реализации UIAlertController.
Я создал подкласс AQAlertAction для UIAlertAction. Вы можете использовать его для ошеломляющих предупреждений, использование такое же, как вы используете UIAlertAction. Все, что вам нужно сделать, это импортировать AQMutiAlertFramework в ваш проект, или вы можете также включить класс (см. Пример проекта ). Внутренне Он использует двоичный семафор для ошеломления Оповещений, пока пользователь не обработает действие, связанное с отображаемым текущим предупреждением. Дайте мне знать, если это сработает для вас.
Вы не можете одновременно отображать несколько предупреждений, и если вы делали это раньше, вы плохо себя чувствовали. Переосмыслите свой интерфейс.
Вы можете легко представить предупреждения подряд , что вам действительно нужно:
let alert = UIAlertController(title: "One", message: nil, preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Next", style: .Default, handler: {
_ in
let alert2 = UIAlertController(title: "Two", message: nil, preferredStyle: .Alert)
alert2.addAction(UIAlertAction(title: "OK", style: .Cancel, handler:nil))
self.presentViewController(alert2, animated: true, completion: nil)
}))
self.presentViewController(alert, animated: true, completion: nil)