在 IB 中设置 UINavigationController 及其 RootViewController 的正确方法

Posted

技术标签:

【中文标题】在 IB 中设置 UINavigationController 及其 RootViewController 的正确方法【英文标题】:Correct way of setting up UINavigationController and its RootViewController in IB 【发布时间】:2011-11-25 10:28:46 【问题描述】:

我的 iPad 应用程序具有以下结构:

应用 UINavigationController(为顶栏提供UIBarButtons 等) 初始登录屏幕 第二个登录屏幕

我不确定现在应该如何在 Interfacebuilder 中正确设置它。我的猜测是我创建了两个 ViewController:

    LoginVC1:(这个也应该包括 NavigationController,因为它是两个屏幕中的第一个) LoginVC2:基于来自LoginVC1 的一些委托回调,我的应用程序将推送到这个 ViewController。

这是我在 IB 的LoginVC1: LoginVC1 http://k.minus.com/jpamEAFkBjpKT.png

当我以模态方式呈现它时,它看起来像这样,这不是我想要的: Result http://k.minus.com/jHAYRnY788jFt.png

结果:

ViewController 的标题和取消按钮都没有显示 尽管我在 IB 中有视图,但视图似乎是空的 我已将UINavigationController 的演示模式设置为FormSheet,因为它以全屏显示,所以也被忽略了。

我做错了什么?

【问题讨论】:

也许我应该只发布两张带有“查找错误”文字的图片:-) 你把rootViewController设置成navigationBarController了吗? @Kjuly 我只是简单地使用presentModalViewController 来显示对话框,但由于我的 UINavigationControler 包含一个 UIViewController(参见 nib-screen),我会假设这个 ViewController 在显示模式时显示。 我错过的消息?!我很抱歉..你解决了吗?也许您应该接受@CodaFi 的回答。 :p 【参考方案1】:

Kjuly 我只是简单地做 presentModalViewController 来显示对话框,但是 因为我的 UINavigationControler 包含一个 UIViewController (见 nib-screen),我会假设这个 ViewController 在 模态显示出来了。

并非总是如此。将其添加到 UINavigationController Hierarchy 不会添加为 rootViewController。这必须在这样的代码中完成:

UIViewController *rootViewController = [[[ExamplesViewController alloc] init] autorelease];
UINavigationController * navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];

另外,请检查您是否正在呈现 NavigationController,而不是模态显示 ViewController。

要解决 NavigationBar 标题问题,请尝试在

中设置 self.title 属性

-(void)viewDidload 方法,看看是否有效。如果没有,请尝试self.//instance of UINavigationController//.navigationBar.title = @"string"

至于没有显示的其他按钮,我的猜测是,如果在代码中设置根控制器没有帮助,那么您只在 .h 中引用它们,而不是实例化它们。所以要么在.h中调用这样的东西:

//.h
@implementation ExampleViewController: UIViewController <UITextFieldDelegate> 

     IBOutlet UIBarButtonItem * CancelButton;
     IBOutlet UITextField * usernameField;
     IBOutlet UITextField * passwordField;
     IBOutlet UIButton * loginButton;

@property (nonatomic, retain) IBOutlet UIBarButtonItem * CancelButton;
@property (nonatomic, retain) IBOutlet UITextField * usernameField;
@property (nonatomic, retain) IBOutlet UITextField * passwordField;
@property (nonatomic, retain) IBOutlet UIButton * loginButton;

然后连接XIB中的outlets,或者实例化.m中的按钮:

//.m 

-(void)viewDidLoad 

//do stuff
    CancelButton = [[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleDone target:self action:@selector(dismissSelf)]autorelease];

//do more stuff


【讨论】:

以上是关于在 IB 中设置 UINavigationController 及其 RootViewController 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IB 中设置导航栏和工具栏背景图像

如果我的子视图的大小与其父视图相同,如何使用 ctrl-drag 在 IB 中设置约束?

以编程方式在 UINavigationController 中设置 UINavigationBar 的自定义子类

UILabel 在使用文本设置属性时显示自定义字体错误,但在代码中设置时工作正常

在 UIScrollview 中设置 size 属性

IB for iPhone 中用户定义的运行时属性不起作用