2009-05-27 72 views
27

作为Cocoa新手,我遇到了几个与Interface BuilderUIViewController和朋友有关的问题。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工具中)。

+0

相关问题:http://stackoverflow.com/questions/1479576/viewdidload-not-called-in-subclassed-uiviewcontroller – Casebash 2011-04-18 02:53:14

+4

你有问题的朋友吗? – Marty 2012-04-14 23:59:19

回答

12

好的,我有一个部分答案 - 也许大师可以解释一些。问题是:

[self.navigationController pushViewController:myViewController animated:YES]; 

仔细看,在这种情况下self.navigationController为零 - 这样的推送消息会没有地方。

相反,如果我送:

[self.view addSubview:self.myViewController.view]; 

,那么该观点似乎和-viewDidLoad被调用。

我不完全知道为什么self.navigationController没有在这种情况下设置 - 我能想到的唯一的事情就是selfUIViewController而非UITableViewController(其中pushViewController代码的来源)的子类。

此外,默默地允许消息去零似乎是一个坏主意,但these answers否则说。另见我的问题here

最后编辑:

答案在下面的评论,我已经意识到我其实后(给myViewController是模态)的显示功能:

[self presentModalViewController:myViewController animated:YES]; 

感谢大家的有益响应。

4

确保在文件的所有者(你的viewController子类)认为出口连接到实际的视图(即480X320的画布您在屏幕,你用它来创建用户界面上看到的)

+0

是啊,谢谢,这当然是这种情况 - 我在上面提到过,但只是重复检查。 – Justicle 2009-05-27 02:18:11

4

它看起来像一个资本化问题给我。您在调用pushViewController时引用类MyViewController而不是属性myViewController

+0

我的糟糕的是,只是一个错字,而移动代码到stackoverflow - 我现在正在解决这个问题。谢谢。 – Justicle 2009-05-27 02:33:30

2

检查您的运行日志中是否有错误。几乎可以肯定的是,NIB没有加载,并且应该有这样的错误。最可能的原因是未能将其放入捆绑包中。查看您的“复制资源”构建阶段,并确保XIB实际上正在被复制。为模拟器构建,然后进入构建目录,并确保NIB位于.app包中。

+0

所有优点,CompileXIB被调用,并且MyViewController都处于“复制资源”阶段并出现在应用程序包中。用干净的版本检查了几次。 另外我修改了-initWithNibName NSLog来写'self',结果是:“initWithNibName self = ”,所以它看起来像被加载。 – Justicle 2009-05-27 03:24:17

+1

initWithNibName:bundle:不加载NIB。第一次调用-view加载NIB(所以检查自己没有证明任何东西)。检查self.naviagationController不是零。如果是这样,那么你永远不会实际加载NIB。此外,你可能会泄漏到你的作业self.myViewController(假设它是一个“保留”属性,它应该是)。你需要autorelease它。虽然,在那里使用访问者的荣誉。在可可,当“没有任何事情发生”时,事情就是零。最常见的情况是你没有用IB连接它。 – 2009-05-27 03:51:43

+0

啊,感谢罗布,没有看到你的评论 - 问题是,事实上,self.navigationController是零。不知道为什么(请参阅下面的答案)。 – Justicle 2009-05-27 06:10:04

8

解决方案发现!!!!!

即使是一件无害的事情,因为这会导致发生方法调用viewDidLoad

插入此右页头后initWithNibName

viewController.view.hidden = NO; //calls viewDidLoad 
26

RE:发现的解决方案!!!!!

事实上,这似乎是一个工作的解决方案,但真正的诀窍不在于将view.hidden属性设置为NO,从nib文件加载视图的方式是调用视图方法,只能实际获取视图当第一次调用view方法时从nib加载。

从这个意义上说,简单的[viewController view]消息将强制视图从nib文件加载。

5

只需使用

- (void)viewDidAppear:(BOOL)animated{ 
     [super viewDidAppear:animated]; 
     //Your Code here 
    } 

代替viewDidLoad方法的。

1

另一个原因,回想起来有些明显:如果在代码中设置了viewController.view,那么viewDidLoad事件将不会触发。

5

很可能您没有将中的ViewController,main.storyboard与您创建的自定义class相链接。您可能能够通过segse从其他视图控制器导航到该控制器,但viewDidLoad(),viewWillAppear()等中的任何一个都不会执行。