子类化UINavigationController以在视图之间进行自定义导航

时间:2012-10-17 07:47:52

标签: iphone ios uinavigationcontroller

我正在使用UINavigationController制作一个带有以下视图层次结构的小应用程序:

  

登录 - >选项 - >三种不同的观点

问题是我想以下列方式在最后3个视图之间导航:

1<->2
1<->3
2<->3

即。能够从任何其他视图切换到任何视图,这提醒UITabViewController功能。因此,它不是分层的,它是任意图形。要在视图之间切换,我将使用导航栏中的按钮。

对我来说最简单的方法是继承UINavigationController,添加与我的视图对应的属性,并实现在这些视图之间切换的方法(使用pushViewController和popToRootViewController)。这些方法将从视图中调用以进行切换(导航)。

但是引用说UINavigationController不用于子类化。 http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html

你建议我做什么?

2 个答案:

答案 0 :(得分:0)

我会保留UINavigationController但不使用通常的pushViewController:,而是切换这样的视图:

NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy];
    // from here you can modify the order of controllers as much as you want
[viewControllers addObject:nextViewController];
[viewControllers removeObject:self];

[self.navigationController setViewControllers:viewControllers animated:YES];

如果您不想要动画的结果,可以设置animated:NO并将setViewControllers:括在[UIView animate...]块中,或添加自己的自定义CAAnimation到导航控制器的图层。

答案 1 :(得分:0)

使用以下代码将视图控制器添加到导航控制器

从第一个导航 - &gt;第二次

SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    NSMutableArray *navigationarray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
    [navigationarray removeAllObjects];
    [navigationarray addObject:secondView];
    self.navigationController.viewControllers = navigationarray;

从第一个导航 - &gt;第三个

ThirdViewController *thirdView = [[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil];
    NSMutableArray *navigationarray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
    [navigationarray removeAllObjects];
    [navigationarray addObject:thirdView];
    self.navigationController.viewControllers = navigationarray;

以上代码将从导航阵列中删除所有viewControllers,并放置一个全新的View Controller

如果您想转到特定的视图控制器,请使用以下代码...

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]

将索引更改为堆栈中的ur view controller。