繁体   English   中英

UIViewController -viewDidLoad 未被调用

[英]UIViewController -viewDidLoad not being called

作为 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 工具中)。

回复:找到解决方案!!!!!

确实,这似乎是一个view.hidden解决方案,但是真正的技巧不是将view.hidden属性设置为 NO,从 nib 文件加载视图的原因是调用UIViewController's视图方法,视图实际上只从第一次调用视图方法时的笔尖。

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

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

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

仔细观察,在这种情况下self.navigationController为零 - 因此推送消息无处可去。

相反,如果我发送:

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

然后视图出现并-viewDidLoad

我不完全确定为什么在这个实例中没有设置self.navigationController - 我唯一能想到的是selfUIViewController的子类而不是UITableViewControllerpushViewController代码来自哪里)。

此外,默默地允许消息为零似乎是一个坏主意,尽管这些答案另有说明。 另请参阅我的问题here

最终编辑:

下面评论中的答案,我已经意识到我实际追求的显示功能(鉴于 myViewController 是模态的)是:

[self presentModalViewController:myViewController animated:YES];

感谢大家的有益回答。

找到解决方案了!!!!!

即使像这样无害的事情也会使viewDidLoad方法调用发生。

在 alloc initWithNibName之后插入这个

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

您可能没有将main.storyboard假定的ViewControllerIdentity Inspector到您创建的自定义class 您可能能够通过 segues 从其他视图控制器导航到该控制器,但不会执行任何viewDidLoad()viewWillAppear()等。

确保 File's Owner(您的 viewController 子类)中的视图出口连接到实际视图(即您在屏幕上看到的用于构建 UI 的 480X320 画布)

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

只需使用

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

而不是 viewDidLoad 方法。

对我来说,这看起来像是一个大写问题。 您在调用 pushViewController 时引用类MyViewController而不是属性myViewController

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

除了这里的其他答案,

当您从故事板实例化 ViewController 的标识符不正确时,经常会发生这种情况。 例如

[[self getStoryboard] instantiateViewControllerWithIdentifier:MyVC];

如果MyVC是某个其他 ViewController 的标识符,则可能会发生这种情况。

OP 在这里使用nib而不是故事板。 但答案是适用的。

该页面已显示,但在调试视图层次结构和设备(模拟器)中不可见,问题发生基于,我找到了修复:

func viewWillLayoutSubviews{
     if day == true{
            self.view.backgroundColor = .clear
     }else{
            self.view.backgroundColor = .blue
     }
}

不要试图在 layoutsubviews 的函数中实现 self.view(viewcontrollers 视图)。 所以最好在 viewwillappear 或 viewdidload 中使用 self.view。 此问题从 v-14 设备开始发生。

希望它也适用于你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM