Right design pattern for tabbed navigation views?

。_饼干妹妹 提交于 2019-12-30 07:42:58

问题


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:


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.



来源:https://stackoverflow.com/questions/6600956/right-design-pattern-for-tabbed-navigation-views

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!