ViewDidLoad在添加到容器视图时未被调用

我有一个容器视图设置在故事板文件中,但我想在设置一些属性后以编程方式embedded视图控制器。 这是我父母VC的viewDidLoad中的代码:

_workoutVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"entryTableVC"]; _workoutView = _workoutVC.tableView; [self addChildViewController:_workoutVC]; [_workoutVC.tableView setFrame:_container.bounds]; [_container addSubview:_workoutView]; 

但是,在任何时候都不会调用子项中的viewDidLoad。 当我运行模拟器我的容器视图是空白的。 我已经检查了debugging器,我的任何属性都是nil

“我想在设置一些属性后以编程方式embedded视图控制器”—你不能这样做。 如果你有一个容器视图,你会自动获得一个视图控制器embedded其中,它的viewDidLoad在父控制器的viewDidLoad之前被调用。 如果你想设置embedded式控制器的一些属性,你可以在父控制器的prepareForSegue中做到这一点。

如果您没有使用embedded式segue并且正在手动添加子视图控制器,为什么要使用容器视图呢? 尝试这个:

 _workoutVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"entryTableVC"]; _workoutView = _workoutVC.tableView; [self addChildViewController:_workoutVC]; [_workoutVC.view setFrame:self.view.frame]; [self.view addSubview:_workoutVC.view]; 

viewDidLoad:方法在第一次访问view属性时被调用。 我假设在你的情况下view == tableView 。 如果没有,你必须调整你的子VC的loadView方法。

 - (void)loadView { //create your table view here //... self.view = self.tableView; } 

然后使用view属性而不是tableView

 _workoutView = _workoutVC.view; 

编辑:

完整的代码将是:

 _workoutVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"entryTableVC"]; _workoutView = _workoutVC.view; [self addChildViewController:_workoutVC]; [_workoutView setFrame:_container.bounds]; [_container addSubview:_workoutView]; 

(Swift 2)由于这个问题没有被接受的答案…

我最终做的是在子视图控制器上创build一个便利的init:

 convenience init() { self.init(nibName: "ChildViewController", bundle: nil) //initializing the view Controller form specified NIB file } 

并在parentViewController的viewDidLoad()中

 let commentsView = CommentsViewController() self.addChildViewController(commentsView) self.momentsScrollView.addSubview(commentsView.view) commentsView.didMoveToParentViewController(self) 

我用一个简单的UIView不UIContainerView,但它是相似的。

我也有类似的情况。 我在容器视图控制器中使用了一个普通的UIView(与Xcode提供的“Container View”相反)。

我使用的事件序列是:

  ChildViewController *childViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"ChildViewController"]; childViewController.view.frame = self.viewForChildViewController.frame; self.viewForChildViewController = childViewController.view; [self.view addSubview:self.viewForChildViewController]; [self addChildViewController:childViewController]; [childViewController didMoveToParentViewController:self]; 

这是一个舞蹈,但它允许我以编程方式设置子视图控制器,并确保-viewDidLoad在子视图控制器上调用。 另外,你应该可以在这之后设置一些属性。

对不起,这是迟到,但我遇到了这个问题。 这是InterfaceBuilder的一个难题,偶尔它不会为自定义类创build完整的信息,所以segue没有find控制器类。

在我的情况下,我有两个相同的视图embeddedTableViewControllers。 第一次工作,第二次没有。 当检查故事板作为源代码时,我看到第二个缺less一些额外的信息,当我添加它时,调用了viewDidLoad。 解决这个问题

1)打开你的故事板作为源代码。

2)searchfindembedded式视图控制器的customClass

 customClass="MyEmbeddedViewController" 

2)在它后面添加下面的值(MyAppProject应该是你的项目的名称,目标只是目标)。

 customModule="MyAppProject" customModuleProvider="target" 

您的embedded式控制器现在应该触发viewDidLoad并正常工作。

对任何人可能仍然有相同的问题。

我有一个类似的情况,并通过调用loadView()来解决它。

 let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController controller.loadView() 

我可以访问视图内的所有内容。