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

odopli94  于 2023-02-26  发布在  iOS
关注(0)|答案(7)|浏览(457)

我在我的故事板文件中设置了一个容器视图,但是我想在设置一些属性后以编程方式嵌入视图控制器。这是我在父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

qrjkbowd

qrjkbowd1#

如果你没有使用嵌入式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];
yxyvkwin

yxyvkwin2#

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

yv5phkfx3#

(斯威夫特2)因为这个问题没有一个公认的答案......
我最终做的是在子视图控制器上创建一个方便的init:

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

在父视图控制器的**viewDidLoad()**中:

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

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

kuuvgm7e

kuuvgm7e4#

我也有过类似的情况,我在容器视图控制器中使用了普通的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。此外,您应该能够在此之后设置一些属性。

x8diyxa7

x8diyxa75#

很抱歉,现在已经很晚了,但是我刚刚遇到了这个问题。这是InterfaceBuilder的一个模糊问题,有时候它不能为自定义类创建完整的信息,所以segue找不到控制器类。
在我的例子中,我有两个嵌入了TableViewControllers的相同视图。第一个可以工作,第二个不行。当我把故事板作为源代码检查时,我发现第二个缺少一些额外的信息,当我添加它时,viewDidLoad被调用了。为了解决这个问题
1)将情节提要作为源代码打开。
2)搜索以查找嵌入式视图控制器的customClass

customClass="MyEmbeddedViewController"

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

customModule="MyAppProject" customModuleProvider="target"

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

mnemlml8

mnemlml86#

“我想在设置了一些属性后以编程方式嵌入视图控制器”---你不能这么做。如果你有一个容器视图,你会自动得到一个嵌入其中的视图控制器,并且它的viewDidLoad会在父控制器的viewDidLoad之前被调用。如果你想设置嵌入控制器的一些属性,你可以在父控制器的prepareForSegue中完成。

dnph8jn4

dnph8jn47#

任何可能还有同样问题的人。
我遇到过类似的情况,通过调用loadView()解决了这个问题。

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

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

相关问题