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()
我可以访问视图内的所有内容。