添加到Container View时未调用ViewDidLoad

问题描述 投票:4回答:7

我在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

ios objective-c viewdidload
7个回答
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];

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];

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,但它很相似。


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。此外,您应该能够在此之后设置一些属性。


0
投票

对不起,这已经很晚了,但我遇到了这个问题。这是InterfaceBuilder的一个晦涩的问题,偶尔它不会为自定义类创建完整的信息,因此segue没有找到控制器类。

在我的例子中,我有两个相同的视图与嵌入式TableViewControllers。第一个工作,第二个没有。在检查Storyboard作为源代码时,我看到第二个缺少一些额外的信息,当我添加它时,调用了viewDidLoad。解决这个问题

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

2)搜索以查找嵌入式视图控制器的customClass

customClass="MyEmbeddedViewController"

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

customModule="MyAppProject" customModuleProvider="target"

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


-1
投票

“我想在设置一些属性后以编程方式嵌入视图控制器”---你不能这样做。如果您有容器视图,则会自动获取嵌入在其中的视图控制器,并且在父控制器的viewDidLoad之前调用其viewDidLoad。如果要设置嵌入式控制器的某些属性,可以在父控制器的prepareForSegue中执行此操作。


-3
投票

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

我遇到了类似的情况,只需调用loadView()即可解决问题。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.