0

私はAppleのドキュメントと同様のStackOverflowの質問をよく見てきましたが、タブバーを使用しているときにnavigationControllerがnullになる理由に固執しています。私はほとんどのアプリをコードから構築しようとしていますが、ナビゲーションコントローラーを挿入するためにXIBを使用していません。

デバッグ中、アプリを2つのタブに大幅に簡素化しました。1つのタブにはテーブルビューがあり、行に触れると(XIBからの)詳細ページが表示されることを期待しています。かなりシンプルなはずです。詳細ビューをプッシュしようとすると、self.navigationControllerの値がNULLであることがわかりましたが、もちろん機能していません。タブバーを完全に使用しましたが、単一のビュー(テーブルビュー)からは正常に機能します。この場合、self.navigationControllerに値があります。

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // With Tab Bars

    self.tabBarController = [[UITabBarController alloc] init];

    ViewController *vc1 = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    vc1.tabBarItem.title = @"Words";
    vc1.tabBarItem.image = [UIImage imageNamed:@"tab_feed.png"];

    TextTableViewController *vc2 = [[TextTableViewController alloc] init];
    vc2.tabBarItem.title = @"Text";
    vc2.tabBarItem.image = [UIImage imageNamed:@"tab_live.png"];

    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:vc1];                             
    NSArray* controllers = [NSArray arrayWithObjects:vc2, navController, nil];
    tabBarController.viewControllers = controllers;
    tabBarController.delegate = self;

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.rootViewController = self.tabBarController;
    [window makeKeyAndVisible];
    return YES;  
}

TextTableViewController.mから

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    TextViewController *detailViewController = [[TextViewController alloc] initWithNibName:@"TextViewController" bundle:nil];  
    Text *text = [[Text alloc] init];
    text = [textArray objectAtIndex:indexPath.row];

    detailViewController.TextID = text.textID;
    NSLog(@"Nav Controller: %@",self.navigationController);
    [self.navigationController pushViewController:detailViewController animated:YES];
    NSLog(@"pushed"); 
}

この問題に関連する2つの質問もあります。(1)この行の目的は何ですか。それが入っていても出ていても違いはないようで、Appleの例にはありません。

tabBarController.delegate = self;

(2)タブの配列を作成する場合、ビューの1つがnavigationControllerになります。それがどのタブであるかは重要ですか、それともこれはどのタブにも関連せず、表示されない別のビューである必要があります。ここに問題がありますか?

4

2 に答える 2

2

タブ バー コントローラーのデリゲートに関する質問 (1) の回答については、UITabBarControllerDelegate プロトコル リファレンスを参照してください。タブ バー コントローラーの基本的な機能については、デリゲートを気にする必要はありません。

しかし、たとえば、ユーザーがタブを変更したときに、ドキュメントを保存したり、インターフェイス要素をデフォルト値にリセットしたりするなど、何か特別なことをしたいとしましょう。クラスの 1 つ (おそらくアプリのデリゲートまたは別のコントローラー クラス) を UITabBarControllerDelegate プロトコルに準拠させ、tabBarController:didSelectViewController を実装することができます。

「回答」では、各タブに独自の UINavigation コントローラーが必要かどうかを尋ねました。それは絶対に正しいです。基本的に、各タブは完全に独立した階層であるため、必要なタブごとに個別の UINavigation コントローラーが必要です。

これは、元の投稿の質問 (2) に対する回答も意味するはずです。必要な特定のタブにナビゲーション コントローラーを追加する必要があります。

于 2012-07-08T23:50:30.020 に答える
0

わかりました。見つけました。UINavigationController は、UITabBarController の適切なタブ内に含まれている必要があります。したがって、このコーディング変更 (以下) を行うことで、新しい UINavigationController がテーブルビューを含むタブに埋め込まれます。

UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:vc2];                             
NSArray* controllers = [NSArray arrayWithObjects:vc1, navController, nil];

ここで疑問が生じます: この例が複数必要な場合はどうすればよいでしょうか? タブが必要なタブごとに新しい UINavigationController を作成し、それぞれを rootViewController としてマークしますか?

于 2012-07-08T20:17:42.270 に答える