从AppDelegate演示特定的视图控制器

每次我的应用程序变为活动状态时,我都想呈现一个视图控制器(密码请求类型视图)。 一旦输入正确的密码,它应该弹出堆栈。 我试图推送的密码视图不是初始视图控制器,所以我无法通过AppDelegate的applicationDidBecomeActive访问它。

我也尝试从我的MainViewController的ViewWillAppear中推送密码视图,但当应用程序变为活动状态时它不会被调用; 只有当屏幕刷新时才会显示。

过去几天我一直在研究类似的问题,但我仍然不理解正确的方法。 我听说我可能无法以这种方式推送视图,因为可能会在Storyboard或NavigationController连接/初始化/ etc之前调用applicationDidBecomeActive。

如果任何人都可以提供给我正确的方式来推动/呈现视图,或者如果有其他地方会更好地做这种事情,我会很感激。

解决 :我刚刚从故事板中删除了视图,而是使用了一个笔尖。 我用了:

PasscodeUnlockVC *passcodeUnlock = [[PasscodeUnlockVC alloc] initWithNibName:@"PasscodeUnlockVC" bundle:[NSBundle mainBundle]];
[(UINavigationController *)self.window.rootViewController pushViewController:passcodeUnlock animated:NO];

查看层次数据:

(gdb) po [[(id)UIApp keyWindow] recursiveDescription]
<UIWindow: 0x736a4b0; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x7367b40>>
   | <UILayoutContainerView: 0x76977a0; frame = (0 0; 320 480); autoresize = W+H; layer =     <CALayer: 0x769de60>>
   |    | <UINavigationTransitionView: 0x7692110; frame = (0 0; 320 480); clipsToBounds = YES;      autoresize = W+H; layer = <CALayer: 0x769a8c0>>
   |    |    | <UIViewControllerWrapperView: 0x73868d0; frame = (0 64; 320 416); autoresize =  W+H; layer = <CALayer: 0x75510e0>>
   |    |    |    | <UIView: 0x76b93e0; frame = (0 0; 320 416); autoresize = W+H; layer = <CALayer: 0x7386850>>
   |    | <UINavigationBar: 0x73664b0; frame = (0 20; 320 44); clipsToBounds = YES; opaque =  NO; autoresize = W; layer = <CALayer: 0x7366550>>
   |    |    | <UINavigationBarBackground: 0x7360ea0; frame = (0 0; 320 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7366520>> - (null)
   |    |    | <UINavigationItemView: 0x76b95e0; frame = (160 21; 0 0); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x76aa8e0>>
   |    |    | <UINavigationItemButtonView: 0x7550650; frame = (5 7; 73 30); opaque = NO;   userInteractionEnabled = NO; layer = <CALayer: 0x7368b40>>
Current language:  auto; currently objective-c
(gdb) 

我建议你使用applicationWillEnterForeground: :,而不是applicationDidBecomeActive: :,因为它适用于多任务手势。 例如,如果用户双击主页按钮以显示任务栏,则不需要放置锁定屏幕,然后在不更改应用程序的情况下关闭任务栏。

推测你的AppDelegate有一个window属性,并且你知道你的窗口的根视图控制器是一个UINavigationController

- (void)applicationWillEnterForeground:(UIApplication *)application {
    PasscodeViewController *pvc = [[PasscodeViewController alloc] init];
    [(UINavigationController *)self.window.rootViewController pushViewController:pvc animated:NO];
    // [pvc release]; if not using ARC
}

解决了

PasscodeViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"passcodeVCID"]; 
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:vc];
navController.navigationBar.hidden = YES;
vc.mode = @"enable";
self.window.rootViewController = navController;  

applicationWillEnterForeground方法中使用。


快速和广义的方式的快速版本:

getRootViewController().presentViewController(messageVC, animated: true, completion: nil)

func getRootViewController() -> UIViewController
{
    return (UIApplication.sharedApplication().delegate?.window??.rootViewController)!
}
链接地址: http://www.djcxy.com/p/57989.html

上一篇: Presenting a specific view controller from AppDelegate

下一篇: Truly RESTful service live example