我如何显示从任何NSObject子类UIAlertController?

我有一个我正在pipe理的遗留代码库,它需要显示来自各地的警报消息。 这是可怕的做法,需要重构,但这不会很快发生。 在iOS 9中,我需要能够触发和忘记警报视图,并为我pipe理视图显示和排队。

为了显示, UIAlertController ,我们需要UIViewController对象所以你可以用下面的方式来做到这一点。

  UIWindow *keyWindow = [[UIApplication sharedApplication]keyWindow]; UIViewController *mainController = [keyWindow rootViewController]; [mainController presentViewController:alert animated:YES completion:nil]; 

谢谢

正如其他人所暗示的,这通常是不好的做法,打破了MVC的原则。 然而,如果你正在pipe理一个遗留的代码库并重构所有的东西,那么这个类就不是一个选项,我创build了这个类,它允许你像对待旧的UIAlertView那样对待UIAlertController ,它pipe理着显示来自任何类的警报,还为你排队提醒。 ..

https://github.com/sammio2/SMHAlertController

为了在NSObject类中显示UIAlertController,使用下面的代码。

  UIAlertController * popup = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { [popup dismissViewControllerAnimated:YES completion:nil]; }]; [popup addAction:cancel]; UIViewController *rootViewController = [[Helper shareInstance] topViewController]; [rootViewController presentViewController:popup animated:YES completion:nil]; 

//将下面的方法放在全局帮助器类中。

  - (UIViewController *)topViewController { return [self topViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; } - (UIViewController *)topViewController:(UIViewController *)rootViewController { if (rootViewController.presentedViewController == nil) { return rootViewController; } if ([rootViewController.presentedViewController isMemberOfClass:[UINavigationController class]]) { UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController; UIViewController *lastViewController = [[navigationController viewControllers] lastObject]; return [self topViewController:lastViewController]; } UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController; return [self topViewController:presentedViewController]; }