我在storyboard文件中设置了容器视图,但是我想在设置一些属性后以编程方式嵌入视图控制器。这是我在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不会随时调用。当我运行模拟器时,我的容器视图是空白的。我在调试器中检查过我的所有属性都不是nil
。
答案 0 :(得分:0)
首次访问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];
答案 1 :(得分:0)
如果您没有使用嵌入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];
答案 2 :(得分:0)
我有类似的情况。我在容器视图控制器中使用了普通的UIView(而不是Xcode提供的“容器视图”)。
我使用的事件序列是:
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。此外,您应该能够在此之后设置一些属性。
答案 3 :(得分:0)
(斯威夫特2) 由于这个问题没有得到公认答案......
我最终做的是在子视图控制器上创建一个便利初始化:
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,但它是类似的。
答案 4 :(得分:0)
抱歉这已经很晚了,但我遇到了这个问题。这是InterfaceBuilder的一个晦涩的问题,偶尔它不会为自定义类创建完整的信息,所以segue没有找到控制器类。
在我的情况下,我有两个相同的视图与嵌入式TableViewControllers。第一个工作,第二个没有。在检查Storyboard作为源代码时,我看到第二个缺少一些额外的信息,当我添加它时,调用了viewDidLoad。解决这个问题
1)打开故事板作为源代码。
2)搜索以查找嵌入式视图控制器的customClass
customClass="MyEmbeddedViewController"
2)在它之后添加以下值(MyAppProject应该是项目的名称,目标只是目标)。
customModule="MyAppProject" customModuleProvider="target"
您的嵌入式控制器现在应该触发viewDidLoad并正常工作。
答案 5 :(得分:-1)
“我想在设置一些属性后以编程方式嵌入视图控制器”---你不能这样做。如果您有容器视图,则会自动获取嵌入在其中的视图控制器,并且在父控制器的viewDidLoad之前调用其viewDidLoad。如果要设置嵌入式控制器的某些属性,可以在父控制器的prepareForSegue中执行此操作。
答案 6 :(得分:-3)
对任何可能仍有同样问题的人。
我有类似的情况,只需调用loadView()即可解决。
let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController
controller.loadView()
然后我可以访问视图中的所有内容。