UINavigationController - 基础知识

时间:2011-07-12 23:08:25

标签: iphone ios uiviewcontroller uinavigationcontroller

我正在尝试使用UINavigationController,但我不知道如何。到目前为止(大约一年),我一直在使用presentModalViewController和dismissModalViewController来呈现/关闭视图控制器。

所以,这就是我所做的。我的主视图控制器(第一个在启动时显示)称为MainViewController,它扩展了UIViewController。

所以我在我的app delegate中创建了这个启动函数:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    MainViewController *controller = [[MainViewController alloc] init];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller];  
    [self.window addSubview:navigationController.view];  
    [self.window makeKeyAndVisible];

    return YES;
}

在我的MainViewController的viewDidLoad方法中:

- (void)viewDidLoad {

        [super viewDidLoad];

        self.title = @"Title";
        self.navigationController.navigationBar.tintColor = [Constants barColor];

            ....more code...
    }

但是,在我的MainViewController中,我想呈现另一个名为SecondViewController的视图控制器,它需要带有后退箭头按钮的UINavigationBar。那么我是否通过在viewDidLoad方法中设置title和backButton来使SecondViewController扩展UIViewController并执行相同的操作?我该如何呈现呢?我该怎么做才能做到这一点?

3 个答案:

答案 0 :(得分:1)

您需要设置一个根视图控制器,从Apple模板开始最简单。

这就是魔术发生的地方:

UIViewController *controller = [[UIViewController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[controller release];

导航控制器为您完成所有工作(后退按钮,标题,动画) - 它会跟踪!


我的工作流程是:

在viewDidLoad中设置MutableArray,向其添加控制器,例如:

NSMutableArray *array = [[NSMutableArray alloc] init];
MyCustomViewController *customView = [[MyCustomViewController alloc] initWithNibName:@"nib" bundle:@"nil"];
customView.title = @"Second Level";
[array addObject:customView];
self.controllers = array;

然后在你的代表中:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];
    UIViewController *childControllerToBe = [controllers objectAtIndex:row];
    [self.navigationController pushViewController:childControllerToBe animated:YES];
}

通过阅读一本不错的初学者书籍,例如Beginning iPhone Development

,可以学到更多内容。

此外,apple docs总是很好:)

答案 1 :(得分:1)

UINavigationController是UIViewController的子类,但与UIViewController不同,它通常不适合您进行子类化。这是因为导航控制器本身很少在导航栏的视觉效果之外进行自定义。可以相对容易地在代码或XIB文件中创建UINavigationController的实例。 请访问“How to add UINavigationController Programmatically

答案 2 :(得分:0)

您应该将其推入导航堆栈。

斯坦福大学的iPhone课程Lecture将教你很多关于导航栏的知识。 (这是一个快速阅读)

基本上它的核心是你需要这个代码:

[self.navigationController pushViewController:SecondView];

您可以使用PopViewController以编程方式返回,但会自动创建后退按钮。

这是讲座中的一些source code。它涵盖了您遇到的问题。