50

有没有办法让一个 ContainerView 有多个嵌入 segues?目的是让 ContainerView 根据按下的按钮来保存几个不同的 ViewController;一次只能看到一个。我想使用嵌入 segues,以便在 Interface Builder 中,情节提要自动显示为与 ContainerView 相同的大小。

我意识到我可以在 InterfaceBuilder 中手动调整其他 ViewController 的大小,但我想要嵌入 segue 提供的自动调整大小。如果有另一种方法可用,那也很好。没有在 viewDidLoad 上加载视图很好 - 如前所述,显示的 ViewController 可以根据按下的按钮而改变。

4

7 回答 7

50

不,没有办法让多个嵌入 segue 到一个容器视图。在 IB 中进行所有设置的一种方法是使嵌入式控制器成为 UITabBarController(隐藏标签栏)。然后,您可以在选项卡中拥有任意数量的控制器,并使用 UITabBarController 的 selectedIndex 属性在代码中切换到它们。

于 2013-08-23T16:52:38.257 回答
17

是的,我能够在@rdelmar 帖子的启发下实现您正在寻找的东西。您需要做的是将 a 嵌入UITabBarViewController到您的容器视图中。然后您以编程方式选择您想要呈现的控制器。您可能还想隐藏标签栏。

容器视图间接包含更多视图

如果您愿意,您还可以隐藏故事板文件中看到的标签栏

您可以通过继承 UITabBarController 来选择要呈现的视图控制器:

override func viewDidLoad() {
    super.viewDidLoad()
    self.selectedIndex = 1
}

您可以通过调用self.tabBarController?.tabBar.isHidden = true在视图控制器中隐藏标签栏viewDidLoad()

于 2016-07-09T16:01:43.573 回答
15

我承认这个问题有点老了,但我想回答一下,以防你还在寻找或其他人发现这个问题。我有一个类似的问题,我解决了它。

简而言之,您将拥有三层:
- 一个外部视图控制器(“ExternalViewController”)
- 一个视图控制器管理器(“ViewControllerManager”)
- 您实际想要在其之间切换的子视图控制器(“ChildViewController”)

在 ExternalViewController 中使用容器视图,并将 segue 嵌入到 ViewControllerManager。然后,ViewControllerManager 本身会以编程方式保存其他 ChildViewController,如本 Apple 文档中所述,特别是有关添加和删除子项的部分。

添加子视图控制器时,将其框架设置为与 ViewControllerManager 的框架相同(因为您在 ViewControllerManager 中执行此操作,请将子视图控制器设置为等于 self.view.frame)。当然,您还需要一些逻辑和外部控件来在 ExternalViewController 内部进行切换。

希望这可以帮助!

于 2013-10-31T14:50:32.730 回答
14

我发现这篇精彩的文章准确地解释了如何做到这一点:http ://sandmoose.com/post/35714028270/storyboards-with-custom-container-view-controllers

你得到你的容器并且可以在后面调用任何视图控制器,有一些设置可以将所有东西链接起来,但是一旦完成,你就会得到一个仍然可用的故事板。

于 2015-01-13T11:07:00.123 回答
4

我通过使用-shouldPerformSegueWithIdentifier:sender:. 我有一个容器,它传递了一个对象,并根据该对象的类型决定要显示哪个子视图控制器。

该结构似乎有点过于复杂,但允许基本视图控制器忽略我拥有的不同类型的任务,将其留给容器视图控制器。容器视图控制器具有多个容器视图,这些视图仅根据任务的类型执行。

我不知道您是否可以通过调用手动执行嵌入转场,-performSegueWithIdentifier:sender:但这也可能是一种可能性。

于 2014-06-05T10:18:49.503 回答
2

我也为此苦苦挣扎了很长时间。我有一个不同但相似的嵌入式表格视图控制器,我想根据在视图控制器中设置的参数来显示它们。有效的是在视图控制器中放入带有 IBOutlet 的嵌入式容器。容器可以在 IB 中设置大小限制。但是,不要在 IB 中进行任何嵌入 segue。然后在 viewDidLoad 中,我以编程方式添加正确的视图控制器并将其边缘固定到嵌入容器。

这种方法的核心体现在以下代码(Swift 4)中:

extension UIView {
    func pinToParent() {
        self.translatesAutoresizingMaskIntoConstraints = false
        let attributes: [NSLayoutAttribute] = [.top, .bottom, .right, .left]
        NSLayoutConstraint.activate(attributes.map {
            NSLayoutConstraint(item: self, attribute: $0, relatedBy: .equal, toItem: self.superview, attribute: $0, multiplier: 1, constant: 0)
        })
    }
}

class ColorVC: UIViewController {

    @IBOutlet weak var tableContainer: UIView!
    var color : rgb = .red

    fileprivate var colorTableVC : ColorTableVC?

    override func viewDidLoad() {
        super.viewDidLoad()

        switch color {
        case .red:
            colorTableVC = RedTableVC.init(style: .plain)
        case .green:
            colorTableVC = GreenTableVC.init(style: .plain)
        case .blue:
            colorTableVC = BlueTableVC.init(style: .plain)
        }
        if let vc = colorTableVC {
            if (vc.view) != nil {
                self.addChildViewController(vc)
                tableContainer.addSubview(vc.view)
                vc.view.pinToParent()
                vc.didMove(toParentViewController: self)
            }
        }
    }
}

在 ColorVC 中,可以看到容器 IBOutlet 和主表视图控制器设置的“颜色”参数。RedTableVC、GreenTableVC 和 BlueTableVC 都是 ColorTableVC 的子类,ColorTableVC 是 UITableViewController 的子类。共同的遗产让我使用一个“colorTableVC”变量来指向任何实例化的控制器。(并非完全必要)。但这确实避免了复制下面的代码以在层次结构中添加视图并将新控制器固定到容器视图。在顶部,我对 UIView 进行了扩展,以将视图固定到其父边缘。

下图显示了如何在 IB 中设置项目,尤其是右侧的视图控制器。对于这个例子,我将“嵌入式”控制器的高度设置为主视图控制器高度的一半——因此当您旋转设备时,可以看到确实应用了 IB 中设置的约束。

嵌入式控制器 IB 设置

于 2017-12-20T05:13:22.643 回答
-1

在您的工作 viewController 中拖动一个 uiview 并将约束设置为顶部、前导、尾随、底部到安全区域(Iphone X 系列)。

现在将容器视图(内容视图)放入该 UIView 中。在该 UIView 中放置任意数量的内容视图并嵌入到相应的 ViewContrllers 中。

为我工作。

于 2019-10-18T12:09:16.133 回答