从AppDelegate呈现特定的视图控制器 [英] Presenting a specific view controller from AppDelegate

查看:109
本文介绍了从AppDelegate呈现特定的视图控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to present a view controller (a passcode request type view) every time my app becomes active. Once the correct passcode is entered, it should pop off the stack. The passcode view I'm trying to push isn't the initial view controller, so I'm having trouble accessing it from the AppDelegate's applicationDidBecomeActive.

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

I also tried pushing the passcode view from my MainViewController's ViewWillAppear, but it doesn't get called when the app becomes active; only when the screen is refreshed.

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

I've been researching similar problems across SO the past couple days, but I'm still not understanding the proper method. I've heard that I might not be able to push the view this way because the applicationDidBecomeActive may be called before the Storyboard or NavigationController is connected/initialized/etc.

如果任何人都可以向我提供推送/展示视图的正确方法,或者如果在其他地方做这类事情会更好,我会很感激。

If anyone could provide me with the correct way to push/present the view, or if there's somewhere else that'd be better to do this type of thing, I'd appreciate it.

解决:我刚从故事板中删除了视图并使用了笔尖代替。我用过:

Solved: I just deleted the view from storyboard and used a nib instead. I used:

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:,因为它可以更好地处理多任务处理手势。例如,如果用户双击主页按钮以显示任务栏,则不想放置锁定屏幕,然后在不更改应用程序的情况下关闭任务栏。

I suggest you use applicationWillEnterForeground:, not applicationDidBecomeActive:, because it works better with multitasking gestures. For example, you don't want to put up the lock screen if the user double-clicks the home button to display the task bar, and then dismisses the task bar without changing apps.

大概你的 AppDelegate 有一个窗口属性,你知道你的窗口的根视图控制器是 UINavigationController

Presumably your AppDelegate has a window property, and you know that your window's root view controller is a UINavigationController.

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

这篇关于从AppDelegate呈现特定的视图控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆