2012-03-03 3 views
7

私のアプリケーションがアクティブになるたびにビューコントローラ(パスコード要求タイプビュー)を表示しようとしています。正しいパスコードが入力されると、スタックから飛び出すはずです。プッシュしようとしているパスコードビューは最初のビューコントローラではないので、AppDelegateのapplicationDidBecomeActiveからアクセスするのに問題があります。AppDelegateから特定のビューコントローラを提示する

また、MainViewControllerのViewWillAppearからパスコードビューをプッシュしようとしましたが、アプリケーションがアクティブになったときに呼び出されることはありません。画面がリフレッシュされたときのみです。

私は過去数日間にわたって同様の問題を研究してきましたが、まだ適切な方法を理解していません。 StoryboardやNavigationControllerが接続/初期化される前などに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) 
+0

私は 'viewDidBecomeActive'メッセージに慣れていないんだ、と私はそれのために' developer.apple.com'を検索するとき、私は結果を得ませんでした。おそらく、この方法についてもっと詳しく教えてください。あるいは、あなたのコードを見せてください。 –

+0

申し訳ありませんが、私はapplicationDidBecomeActiveを意味しました。私は投稿を編集します。 –

+0

私はあなたのモーダルビューを再現しようとしていますが、pushViewController:animatedは認識できません。あなたがiOS 6でこれを試したかどうか教えてください。 – perrohunter

答えて

4

を、私はそれがより良いマルチタスクジェスチャーで動作しますので、あなたが、ないapplicationDidBecomeActive:applicationWillEnterForeground:を、使用することをお勧め。たとえば、ユーザがホームボタンをダブルクリックしてタスクバーを表示してから、アプリケーションを変更せずにタスクバーを閉じると、ロック画面を表示したくない場合などです。

おそらく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 
} 
+0

警告やエラーなしにそのコードを実装しましたが、ビュー全体を表示するのではなく、その下に黒い画面のナビゲーションバーが表示されます。何か案は?私はヘッダ内のビューを宣言する必要はありませんか何かそれを行うのですか?再度、感謝します。 –

+0

デバッガで一時停止し、 'po [[(id)UIApp keyWindow] recursiveDescription]'を実行します。 –

+0

さて、私はビューの階層についての情報を得ましたが、私はそれをどのように解析/使用するかについてはあまりよく分かりません。SOの誰かが黒い画面で同じ問題を抱えていました。解決策は、私がとにかく持っていないloadView実装を削除することでした。 –

0

applicationWillEnterForeground方法を用い

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; 

を解決しました。クイックと一般道の

0

スウィフトバージョン:

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

func getRootViewController() -> UIViewController 
{ 
    return (UIApplication.sharedApplication().delegate?.window??.rootViewController)! 
}