对Cocoa不熟悉,我在Interface Builder
,UIViewController
和朋友方面遇到了一些问题。
我有一个UIViewController
子类,在xib中定义了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工具中)。
答案 0 :(得分:31)
RE:解决方案!!!!!
确实这似乎是一个有效的解决方案,但真正的诀窍不在于将view.hidden
属性设置为NO,是什么使得从nib文件加载视图是调用UIViewController's
视图方法,当第一次调用view方法时,视图实际上只从nib加载。
从这个意义上说,一条简单的[viewController view]
消息会强制从nib文件加载视图。
答案 1 :(得分:14)
好的,我有一个部分答案 - 也许大师可以解释一些。问题是:
[self.navigationController pushViewController:myViewController animated:YES];
仔细观察,在这种情况下self.navigationController
为零 - 所以推送消息不会在哪里。
相反,如果我发送:
[self.view addSubview:self.myViewController.view];
然后显示视图并调用-viewDidLoad
。
我不完全确定为什么在这个实例中没有设置self.navigationController
- 我唯一能想到的是self
是UIViewController
的子类而不是{{1} (UITableViewController
代码来自的地方)。
此外,默默地允许消息转为零似乎是一个坏主意,尽管these answers另有说法。另请参阅我的问题here。
最终编辑:
下面的评论中的答案,我已经意识到我实际上的显示功能(给定myViewController是模态的)是:
pushViewController
感谢大家的有益回应。
答案 2 :(得分:8)
解决方案!!!!!
即使是像这样无害的事情也会导致viewDidLoad
方法调用。
在分配initWithNibName
viewController.view.hidden = NO; //calls viewDidLoad
答案 3 :(得分:5)
只需使用
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
//Your Code here
}
而不是viewDidLoad方法。
答案 4 :(得分:5)
您可能没有将ViewController
中假定的main.storyboard
从Identity Inspector
链接到您创建的自定义class
。您可以通过segues从其他视图控制器导航到该控制器,但viewDidLoad()
,viewWillAppear()
等任何一个都不会被执行。
答案 5 :(得分:4)
确保File's Owner(您的viewController子类)中的视图出口连接到实际视图(即您在屏幕上看到的用于构建UI的480X320画布)
答案 6 :(得分:4)
对我来说,这看起来像是一个大写问题。您在调用pushViewController时引用了类MyViewController
而不是属性myViewController
。
答案 7 :(得分:2)
检查运行日志中的错误。几乎可以肯定,NIB没有加载,并且应该有一个错误。最可能的原因是未能将其放入捆绑中。查看“复制资源”构建阶段,确保实际复制XIB。构建模拟器,然后进入构建目录并确保NIB位于.app包中。
答案 8 :(得分:2)
另一个原因,回想起来有点明显:如果在代码中设置global.jQuery = require("jquery")
,那么viewDidLoad事件将不会触发。
答案 9 :(得分:0)
除了此处的其他答案,
当从情节提要中实例化ViewController的标识符不正确时,通常会发生这种情况。例如
[[self getStoryboard] instantiateViewControllerWithIdentifier:MyVC];
如果MyVC
是其他ViewController的标识符,则可能会发生这种情况。
OP在这里使用nib
而不是情节提要。但是答案适用。
答案 10 :(得分:0)
页面已显示,但在调试视图层次结构和设备(模拟器)中不可见,问题发生基于和 我找到了解决办法:
func viewWillLayoutSubviews{
if day == true{
self.view.backgroundColor = .clear
}else{
self.view.backgroundColor = .blue
}
}
不要试图在layoutsubviews的函数中实现self.view(viewcontrollers视图)。所以最好在viewwillappear或viewdidload中使用self.view。此问题从 v-14 设备开始。
希望它也适用于您。