在 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
(为顶栏提供UIBarButton
s 等)
初始登录屏幕
第二个登录屏幕
我不确定现在应该如何在 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 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
如果我的子视图的大小与其父视图相同,如何使用 ctrl-drag 在 IB 中设置约束?
以编程方式在 UINavigationController 中设置 UINavigationBar 的自定义子类