0

オプションの最上位ナビゲーション コントローラーを持つ iPhone アプリケーションを作成しようとしています。

それを追加しても問題ありませんが、独自のナビゲーション項目を追加しようとしない限り、タイトルを設定しようとすると機能しません。コントローラーによって管理される UINavigationBar。

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    rootHasNavBar = NO; 

    if (window && viewController)
    {

        // Tab Controller is root:
        if (!rootHasNavBar)
        {
           window.rootViewController = viewController; // viewController:UITabBarController
           [window makeKeyAndVisible];
        }
        else
        {
          // Navigation controller  above UITabBarController
          UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
            window.rootViewController = navigationController;
         //Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Cannot call pushNavigationItem:animated: directly on a UINavigationBar managed by a controller.'

          UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:NSLocalizedString(@"RentalPoint",nil)];
          [ navigationController.navigationBar pushNavigationItem:item animated:YES];

            navigationController.toolbarHidden = YES;
          [window makeKeyAndVisible];

        };


    }

どうすればいいですか?それとも、それができない技術的な理由がありますか?

更新: コントローラーのタイトルとナビゲーション項目のタイトルの割り当てをコントローラーの viewDidLoad に移動することを単純に提案した人々は、Cocoa アーキテクチャーの内部 (そして初めての人には非常に直感的でない) の側面に取り組んでいましたが、これはまだ私にはまったくなじみがありませんでした。Cocoa のような巨大で複雑なフレームワークを外側から見ると、ソース コードを参照することはできません。これは、私が最も困難に感じる謎です。私の他の言語とツールでは、フレームワークを含め、いつでもコードを読んでステップインできます。ここでは、できません。ですから、読んで、読んで、読んでください。ありがたいことに、優れたドキュメント ソースがたくさんあります。

4

2 に答える 2

1

UIViewController の init でナビゲーション タイトルを設定します。

self.title = @"My Title";
self.navigationItem.title = @"Nav Title"; //note: this will show-up in the back button when you push a subsequent view

または、それを applicationDidFinishLaunching ルーチンにハード コードしたい場合は、次のようにします。

viewController.title = @"My Title";
于 2013-02-08T22:51:24.297 に答える
1

ナビゲーション コントローラーのルートとしてのタブ バー コントローラーはより複雑なケースであると考えているため、IB でそれを行い、コードの単純なケースを保存しました。まず、次のことを行いました(すべてIBで):

  1. 新しい単一ビュー プロジェクトを作成しました
  2. デフォルトの VC を削除し、ナビゲーション VC を追加しました
  3. ナビゲーション VC のデフォルトのルート (テーブル VC) を削除しました
  4. タブバーコントローラーをペイントし、それをルートにしました
  5. タブバーコントローラーのナビゲーション項目を調べて、タイトルを「レンタルポイント」に設定しました

これにより、ナビゲーションコントローラーで囲まれたタブバーコントローラーで参照する「オプションのケース」がアプリに与えられると思います(「その上」と言いましたが、コードは「その周りに、それをルートとして」と言っています)。

次のように、appDidFinishLaunching でより単純なケースを実現するのが簡単になりました ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // if I don't want the optional case, if I just want a tab bar controller as 
    // my window's root, grab it from the navigation controller, and make it the window's
    // root (thereby abandoning the navigation controller)

    if (YES) {
        UINavigationController *navVC = (UINavigationController *)self.window.rootViewController;
        self.window.rootViewController = [navVC.viewControllers objectAtIndex:0];
    }

    return YES;
}
于 2013-02-09T00:33:45.493 に答える