如何正确使用UINavigationController

3

我最近开始学习编程iOS/iPhone。在XCode5/iOS7出现之前,我以为自己知道该怎么做了。以前,我创建了一个从UIViewController派生的类,其中包含一个XIB文件,添加了一个标签,并通过编程方式将其添加到rootWindow:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ... // boilerplate code
    MyViewController* myRoot = [[MyViewController alloc]init];
    self.window.rootViewController = myRoot;

为了使用导航栏,我稍微修改了代码:
MyViewController* myRoot = [[MyViewController alloc]init];
UINavigationController* navigationController = [[UINavigationController alloc]init];
[navigationController pushViewController:myRoot animated:YES];
self.window.rootViewController = navigationController;

这似乎工作得很好。 然而,在iOS 7上,我的自定义视图控制器顶部的控件似乎在导航栏后面。 一些搜索结果在这个链接中描述了状态栏的变化。

它也似乎表明, A)UINavigationController应该自动处理更改 B)"自动布局"应该自动处理更改,

而且我不需要担心。 然而,我上面的示例应用似乎没有自动处理任何内容。

我还找到了一些其他使用控制器的示例代码:将导航控制器的视图添加为现有视图的subview。 这在应用程序生命周期后期添加导航控制器时有些道理,但我正在尝试在启动时设置一个。

我是否正确地使用了UINavigationController?

我需要考虑什么来适应iOS7和早期版本?

如何配置“自动布局”(我在界面构建器中没有看到这个)?


你之前是使用.xib文件而不是故事板,对吧? - race_carr
@race_carr 是的,只有一个 .xib 文件,没有故事板。 - Travis
1个回答

2
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

这段代码无法编译。self.viewController和self.navigationController不是AppDelegate对象的有效属性。 - Travis
将代码更改为编译后的内容,结果仍然出现相同的问题:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];MyViewController* myController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; UINavigationController* myNav = [[UINavigationController alloc] initWithRootViewController:myController]; self.window.rootViewController = myNav; [self.window makeKeyAndVisible]; return YES;} - Travis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接