UIViewController -viewDidLoad未被调用

Jus*_*cle 31 iphone cocoa-touch uiviewcontroller uiview

作为新的可可,我遇到的几个问题Interface Builder,UIViewController和朋友.

我有一个在xib中定义的UIViewController子类UIView,并且控制器的视图插座连接到视图.xib的"文件所有者"被设置为myViewcontroller子类.

在这一个实例中,以下用于加载控制器/视图的代码(来自主视图控制器)无法按预期工作:

if ( self.myViewController == nil )
{
    self.myViewController = [[MyViewController alloc]
        initWithNibName:@"MyViewController" bundle:nil];
}

[self.navigationController 
    pushViewController:self.myViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

在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");
}
Run Code Online (Sandbox Code Playgroud)

预期结果

调用两者-initWithNibName-viewDidLoad方法,并显示myViewController的视图.

观察结果

-initWithNibName调用,不显示视图.

我错过了什么吗?任何人都可以推荐任何检查?(特别是在奇妙的不透明Interface Builder工具中).

Jad*_*ijo 33

RE:解决方案!!!!!

确实这似乎是一个有效的解决方案,但真正的诀窍不是将view.hidden属性设置为NO,是什么使得从nib文件加载视图是调用UIViewController'sview方法,视图实际上只是从nib加载时第一次调用view方法.

从这个意义上讲,一条简单的[viewController view]消息会强制视图从nib文件加载.

  • 最佳答案.[viewController view] < - 这有助于回答op的问题.这就是-viewDidLoad按需调用的方式. (4认同)
  • 你救了我的一天.非常感谢. (2认同)

Jus*_*cle 14

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

[self.navigationController pushViewController:myViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

仔细观察,在这种情况下self.navigationController是零 - 所以推送消息不会在哪里.

相反,如果我发送:

[self.view addSubview:self.myViewController.view];
Run Code Online (Sandbox Code Playgroud)

然后出现并-viewDidLoad调用视图.

我不完全确定为什么self.navigationController不在这个实例中设置 - 我唯一能想到的是它self是一个子类UIViewController而不是UITableViewController(pushViewController代码来自哪里).

此外,默默地允许消息转为零似乎是一个坏主意,虽然这些答案 说不然.另见我的问题在这里.

最终编辑:

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

[self presentModalViewController:myViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

感谢大家的有益回应.

  • 不要把无声的消息写成nil,当你习惯它时,你会一直使用它:-)当你刚开始时它肯定是神秘的.至于为什么navigationController是nil:它是否被初始化为UINavigationController的根视图控制器?如果没有,你不能使用pushViewController,直到你这样做! (4认同)

小智 8

找到解决方案!!!!!

即便是像这样无害的东西 viewDidLoad方法调用发生.

在alloc之后插入此权限 initWithNibName

viewController.view.hidden = NO; //calls viewDidLoad
Run Code Online (Sandbox Code Playgroud)

  • 这是因为每次使用view-property时,getter和/或setter都会触发加载视图.即使只是输入'self.view;' 这将是足够的enoguh (5认同)

zpe*_*esk 5

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


Lol*_*z89 5

简单地使用

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

而不是viewDidLoad方法.


Yas*_*ala 5

您可能没有将假定ViewController的内容main.storyboard与您创建Identity Inspector的自定义链接起来class.你也许可以导航到通过塞格斯从其他视图控制器,控制器,但是任何的viewDidLoad(),viewWillAppear()等会不会被执行.