UIViewController -viewDidLoad未被调用
作为Cocoa新手,我遇到了几个与Interface Builder
,UIViewController
和朋友有关的问题。UIViewController -viewDidLoad未被调用
我有一个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");
}
预期结果
两个调用和-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
代码的来源)的子类。
此外,默默地允许消息去零似乎是一个坏主意,但these answers否则说。另见我的问题here。
最后编辑:
答案在下面的评论,我已经意识到我其实后(给myViewController是模态)的显示功能:
[self presentModalViewController:myViewController animated:YES];
感谢大家的有益响应。
确保在文件的所有者(你的viewController子类)认为出口连接到实际的视图(即480X320的画布您在屏幕,你用它来创建用户界面上看到的)
是啊,谢谢,这当然是这种情况 - 我在上面提到过,但只是重复检查。 – Justicle 2009-05-27 02:18:11
它看起来像一个资本化问题给我。您在调用pushViewController时引用类MyViewController
而不是属性myViewController
。
我的糟糕的是,只是一个错字,而移动代码到* - 我现在正在解决这个问题。谢谢。 – Justicle 2009-05-27 02:33:30
检查您的运行日志中是否有错误。几乎可以肯定的是,NIB没有加载,并且应该有这样的错误。最可能的原因是未能将其放入捆绑包中。查看您的“复制资源”构建阶段,并确保XIB实际上正在被复制。为模拟器构建,然后进入构建目录,并确保NIB位于.app包中。
所有优点,CompileXIB被调用,并且MyViewController都处于“复制资源”阶段并出现在应用程序包中。用干净的版本检查了几次。 另外我修改了-initWithNibName NSLog来写'self',结果是:“initWithNibName self =
initWithNibName:bundle:不加载NIB。第一次调用-view加载NIB(所以检查自己没有证明任何东西)。检查self.naviagationController不是零。如果是这样,那么你永远不会实际加载NIB。此外,你可能会泄漏到你的作业self.myViewController(假设它是一个“保留”属性,它应该是)。你需要autorelease它。虽然,在那里使用访问者的荣誉。在可可,当“没有任何事情发生”时,事情就是零。最常见的情况是你没有用IB连接它。 – 2009-05-27 03:51:43
啊,感谢罗布,没有看到你的评论 - 问题是,事实上,self.navigationController是零。不知道为什么(请参阅下面的答案)。 – Justicle 2009-05-27 06:10:04
解决方案发现!!!!!
即使是一件无害的事情,因为这会导致发生方法调用viewDidLoad
。
插入此右页头后initWithNibName
viewController.view.hidden = NO; //calls viewDidLoad
RE:发现的解决方案!!!!!
事实上,这似乎是一个工作的解决方案,但真正的诀窍不在于将view.hidden
属性设置为NO,从nib文件加载视图的方式是调用视图方法,只能实际获取视图当第一次调用view方法时从nib加载。
从这个意义上说,简单的[viewController view]
消息将强制视图从nib文件加载。
只需使用
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
//Your Code here
}
代替viewDidLoad方法的。
另一个原因,回想起来有些明显:如果在代码中设置了viewController.view
,那么viewDidLoad事件将不会触发。
很可能您没有将中的ViewController
,main.storyboard
与您创建的自定义class
相链接。您可能能够通过segse从其他视图控制器导航到该控制器,但viewDidLoad()
,viewWillAppear()
等中的任何一个都不会执行。
相关问题:http://*.com/questions/1479576/viewdidload-not-called-in-subclassed-uiviewcontroller – Casebash 2011-04-18 02:53:14
你有问题的朋友吗? – Marty 2012-04-14 23:59:19