Right design pattern for tabbed navigation views?

2019-02-15 13:52发布

I've been stuck trying to puzzle this out for a couple days now, and I'll admit I need help.

The root view controller of my application is a tab bar controller. I want to have each tab bar a different navigation controller. These navigation controllers have completely different behavior.

So how do I set this up in terms of classes? Per Apple's documentation, I'm not supposed to subclass UINavigationViewController. So where do I put the code that drives each of these navigation controllers? Does it all get thrown in App Delegate? That would create an impossible mess.

This app should run on iOS 4.0 or later. (Realistically, I can probably require iOS 4.2.)

1条回答
啃猪蹄的小仙女
2楼-- · 2019-02-15 14:35

This is taken from one of my applications. As you say, you are not supposed to subclass UINavigationController, instead you use them as they are and you add viewcontroller on the UINavigationController's. Then after setting the root viewcontroller in each UINavigationController, you add the UINavigationController to the UITabBarController (phew!).

So each tab will "point" to a UINavigationController which has a regular viewcontroller as root viewcontroller, and it is the root viewcontroller (the one you add) that will be shown when a tab is pressed with a (optional) navigationbar at top.

    UITabBarController *tvc = [[UITabBarController alloc] init];
    self.tabBarController = tvc;
    [tvc release];

    // Instantiates three view-controllers which will be attached to the tabbar.
    // Each view-controller is attached as rootviewcontroller in a navigationcontroller.

    MainScreenViewController *vc1 = [[MainScreenViewController alloc] init];
    PracticalMainViewController *vc2 = [[PracticalMainViewController alloc] init];
    ExerciseViewController *vc3 = [[ExerciseViewController alloc] init];

    UINavigationController *nvc1 = [[UINavigationController alloc] initWithRootViewController:vc1];
    UINavigationController *nvc2 = [[UINavigationController alloc] initWithRootViewController:vc2];
    UINavigationController *nvc3 = [[UINavigationController alloc] initWithRootViewController:vc3];

    [vc1 release];
    [vc2 release];
    [vc3 release];

    nvc1.navigationBar.barStyle = UIBarStyleBlack;
    nvc2.navigationBar.barStyle = UIBarStyleBlack;
    nvc3.navigationBar.barStyle = UIBarStyleBlack;

    NSArray *controllers = [[NSArray alloc] initWithObjects:nvc1, nvc2, nvc3, nil];

    [nvc1 release];
    [nvc2 release];
    [nvc3 release];

    self.tabBarController.viewControllers = controllers;

    [controllers release];

This is how I go from one viewcontroller to another one (this is done by tapping a cell in a tableview but as you see the pushViewController method can be used wherever you want).

(this is taken from another part of the app)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.detailedAnswerViewController == nil) {
        TestAnsweredViewController *vc = [[TestAnsweredViewController alloc] init];
        self.detailedAnswerViewController = vc;
        [vc release];
    }

    [self.navigationController pushViewController:self.detailedAnswerViewController animated:YES];
}

The self.navigationcontroller property is of course set on each viewcontroller which are pushed on the UINavigationController hierachy.

查看更多
登录 后发表回答