作为新的可可,我遇到的几个问题Interface Builder
,UIViewController
和朋友。
我有一个在xib中定义的UIViewController
子类UIView
,并且控制器的视图出口连接到该视图。xib的“文件所有者”被设置为myViewcontroller子类。
在这种情况下,以下代码(从主视图控制器)加载控制器/视图的代码无法正常工作:
if ( self.myViewController == nil )
{
self.myViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:nil];
}
[self.navigationController
pushViewController:self.myViewController animated:YES];
在MyViewController的方法中,我放置了断点和日志消息以查看发生了什么:
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
NSLog(@"initWithNibName\n");
}
return self;
}
-(void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad\n");
}
预期结果
这两个-initWithNibName
和-viewDidLoad
方法被调用,并显示myViewController的观点。
观察结果
仅-initWithNibName
被调用,视图不显示。
我错过了什么吗?任何人都可以推荐检查的东西吗?(尤其是在不透明的Interface Builder工具中)。
好吧,我有一个部分的答案-也许大师可以解释更多。问题是:
[self.navigationController pushViewController:myViewController animated:YES];
仔细观察,在这种情况下self.navigationController
为零-因此,推送消息无处可去。
相反,如果我发送:
[self.view addSubview:self.myViewController.view];
然后该视图出现并被-viewDidLoad
调用。
我不完全确定为什么self.navigationController
没有在这种情况下设置-我唯一能想到的是它self
的子类UIViewController
而不是UITableViewController
(pushViewController
代码来自何处)。
同样,静默地让消息变为零似乎是一个坏主意,尽管这些答案 并非如此。另见我的问题在这里。
最终编辑:
在下面的评论中,我已经意识到我实际想要的显示功能(给定myViewController是模态的)是:
[self presentModalViewController:myViewController animated:YES];
感谢每个人的帮助。
不要把口无言语变成无语,当您习惯了它时便会一直使用它:-)刚开始时它肯定是很神秘的。至于为什么navigationController为nil:是否将其初始化为UINavigationController的根视图控制器?如果没有,您将无法使用pushViewController!
我认为Adam恰好在这里,在尝试获取其navigationController之前,请确保将您的视图正确放置在导航堆栈中。