我如何显示从任何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理着显示来自任何类的警报,还为你排队提醒。 ..
为了在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]; }