UIViewController -viewDidLoad未被调用

时间:2009-05-27 02:03:23

标签: iphone cocoa-touch uiview uiviewcontroller

对Cocoa不熟悉,我在Interface BuilderUIViewController和朋友方面遇到了一些问题。

我有一个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工具中)。

11 个答案:

答案 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 - 我唯一能想到的是selfUIViewController的子类而不是{{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.storyboardIdentity 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 设备开始。

希望它也适用于您。