Ios 一个视图中包含多个ViewController

Ios 一个视图中包含多个ViewController,ios,objective-c,viewcontroller,containment,Ios,Objective C,Viewcontroller,Containment,我有一个UIStackView,我正在动态添加UIViewControllers,下面是我的代码 [self addChildViewController:driverForm]; [self addChildViewController:marketingView]; [self.stackView insertArrangedSubview:driverForm.view atIndex:0]; [self.stackView insertArrangedSubview:marketing

我有一个
UIStackView
,我正在动态添加
UIViewControllers
,下面是我的代码

[self addChildViewController:driverForm];
[self addChildViewController:marketingView];

[self.stackView insertArrangedSubview:driverForm.view atIndex:0];
[self.stackView insertArrangedSubview:marketingView.view atIndex:1];

[driverForm didMoveToParentViewController:self];
[marketingView didMoveToParentViewController:self];
阅读文档后,它声明我必须调用
didMoveToParentViewController


我面临的问题是,没有调用最终的
UIViewController
上的操作,但是第一个ViewController会调用。如果我交换这些,第一个有效,最后一个无效。

UIStackView用于在同一UIViewController类中排列多个子视图。如何将其用于不同的UIViewController


UIStackView用于在同一UIViewController类中排列多个子视图。如何将其用于不同的UIViewController


只需将ViewController的视图添加到UIStackView中,如下所示:

yourStackView.addArrangedSubview(yourViewController.view)
此外,您不必担心视图为零,因为它总是返回UIView


请注意,顺序是相反的,因此最后一个出现在前面。为了解决这个问题,假设您有一个视图控制器数组,您可以使用
stride
反向遍历数组并将视图控制器添加到堆栈中。

只需将视图控制器的视图添加到UIStackView中,如下所示:

yourStackView.addArrangedSubview(yourViewController.view)
此外,您不必担心视图为零,因为它总是返回UIView


请注意,顺序是相反的,因此最后一个出现在前面。为了解决这个问题,假设您有一个视图控制器数组,您可以使用
stride
反向遍历您的数组,并将视图控制器添加到堆栈中。

以下是Swift 5的快速复制/通心粉版本:

private var childViewController: UIViewController
private var stackView: UIStackView?

// MARK: - UIViewController
    
override func loadView() {
    super.loadView()
    
    // 1. Add the child view controller to the parent.
    addChild(childViewController)
    
    // 2 Create and add the stack view containing child view controller's view.
    stackView = UIStackView(arrangedSubviews: [childViewController.view])
    stackView!.axis = .vertical
    self.view.addSubview(stackView!)
    
    // 3. Let the child know that it's been added!
    childViewController.didMove(toParent: self)
}

以下是Swift 5的快速副本/通心粉版本:

private var childViewController: UIViewController
private var stackView: UIStackView?

// MARK: - UIViewController
    
override func loadView() {
    super.loadView()
    
    // 1. Add the child view controller to the parent.
    addChild(childViewController)
    
    // 2 Create and add the stack view containing child view controller's view.
    stackView = UIStackView(arrangedSubviews: [childViewController.view])
    stackView!.axis = .vertical
    self.view.addSubview(stackView!)
    
    // 3. Let the child know that it's been added!
    childViewController.didMove(toParent: self)
}

ChildViewController?UIViewcontroller与数据模型(属性、方法等)协作控制其中的UIView,因此命名为“控制器”。MVC范例?视图控制器容器不关心其子视图的位置或排列方式。在一个视图控制器中为多个子视图设置子视图并使用堆栈视图来排列它们的视图没有错。ChildViewController?UIViewcontroller与数据模型(属性、方法等)协作控制其中的UIView,因此命名为“控制器”。MVC范例?视图控制器容器不关心其子视图的位置或排列方式。在一个视图控制器中为多个子视图设置父视图并使用堆栈视图来排列它们的视图没有错。只是对其进行了更新,我删除了UIStackView并执行了相同的功能,但只是直接添加到UIScrollView中,这就行了。只是对其进行了更新,我删除了UIStackView,并做了相同的功能,但只是直接添加到UIScrollView中,这就成功了。哇,比我想象的要简单