1

ここで非常に興味深い問題が発生しました。私の iPhone アプリには、AppDelegate の rootViewController として UITabbarController があります。

アプリを初めて開いた場合は、基本的に設定する必要があります。この目的のために、UINavigationController を作成し、tabbarController にモーダルで表示するように指示します。

firstRun = [[firstRunViewController alloc] init];
navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun];
[[self tabBarController] presentModalViewController:navCtrl animated:NO];

構成が完了したら、firstRunViewController を取り除きたいと思います。私はこのテクニックを頻繁に使用して-dismissModalViewControllerAnimated:います。

しかし、この星座ではこれはうまくいきません。私が却下を呼んでいるコントローラーからは関係ありません。tabbarController、rootViewController、現在アクティブなviewController、原因のselfおよび他のいくつかのコントローラーを介して試しました。

電話をかけるたび-dismissModalViewControllerAnimated:に、この例外が発生します。

'UIViewControllerHierarchyInconsistency', reason: 'presentedViewController for controller is itself on dismiss for: <UINavigationController:…

誰でも助けることができますか?よろしくお願いします、ジュリアン

編集 私の AppDelegate では、メイン ウィンドウの rootViewController として UITabbarController を使用しています。

self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];

次に、UINavigationController を作成し、UITabbarController に modalViewController を提示するように指示します。

UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun];
[[self tabBarController] presentModalViewController:navCtrl animated:NO];

-dismissModalViewControllerAnimated: を firstViewController で呼び出すと、上記のエラーが発生します。

4

3 に答える 3

1

私はついに自分で答えを見つけました!木々の木が見えませんでした!今はとても幸せです!:)

私は本当にばかげたことをしました。セットアップviewControllersの最後のviewControllerで、ユーザーが管理者であるかどうかに応じて、tabarsviewControllersを変更する必要がありました。だから私はしました:

appDelegate.tabBarController.viewControllers = [NSArray arrayWithObjects:appDelegate.readState,
                                                appDelegate.navCtrl,
                                                appDelegate.settings, nil];

AppDelegateの「navCtrl」をタブバーのviewControllersに追加していたことがわかります。そのため、parentViewControllers(UITabbarController)サブコントローラーに追加したviewControllerを閉じようとしていました。

同時に提示したいものを却下することはお勧めできません!:))

于 2012-07-17T19:26:24.747 に答える
1

私の仮説を検証する機会はありませんが、この問題は、モーダル ビューを表示するのが早すぎるという事実に依存している可能性があると思われます。つまり、早すぎるとは、メイン ウィンドウがタブを設定する機会を得る前に意味します。バーコントローラー。したがって、次の変更を提案します。

  1. ナビゲーション コントローラーをインスタンス化するメソッドを作成します。

    - (void)initializeAndPresentNavigationController {
      UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun];
      [[self tabBarController] presentModalViewController:navCtrl animated:NO];
    }
    
  2. appDidFinishLaunching からナビゲーション コントローラーを直接提示する代わりに、上記のメソッドを非同期的に呼び出します。

    [self performSelector:@selector(initializeAndPresentNavigationController) withObject:nil afterDelay:0.0];
    

ここで、2 で行ったようにメソッドを呼び出すコツは、呼び出しがinitializeAndPresentNavigationControllerメイン ループに単純にプッシュされ、アプリが初期 UI を構築できるようになった後に実行されることです。

それがうまくいくことを願っています。

于 2012-07-15T18:37:09.070 に答える
1

私の意見では、あなたは UITabbarController を悪用しています。このクラスは、UIViewController のサブクラスですが、実際には UIViewController インフラストラクチャをあまり使用しません。

あなたが望むのは、あなたが今持っているもののわずかな延長です。appDelegate で新しい UIViewController サブクラスを作成し、それを単一のオブジェクトとして配列に追加し、tabBar の viewControllers をこの配列に設定します。サブクラスの hidesBottomBarWhenPushed を YES に設定すると、タブ バーが表示されたときに非表示になります。

これでアプリが起動し、UIViewController サブクラスが最前面のビューになります。このビューをモーダルに表示したいものにするか、何らかのアニメーションを使用してサブクラスからそのビューを表示することができます。ああ、サブクラスの背景画像として起動ビューを使用すると、これをスムーズに移行できます-私は今これを行っています.

モーダル ビューが完成したら、表示したいビューをインスタンス化し、それらのビューを tabBarController.viewControllers (またはアニメーション バージョン) で使用するように UITabBarController を設定できます。うんざり、あなたは UIViewController を置き換えます(そしてARCの下では消えます)。

于 2012-07-15T15:04:02.190 に答える