ContainerView具有多个嵌入segues

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ContainerView具有多个嵌入segues相关的知识,希望对你有一定的参考价值。

有没有办法让一个ContainerView具有多个嵌入段?目的是让ContainerView根据按下的按钮保持几个不同的ViewControllers;一次只能看到一个。我想使用嵌入segues,这样在Interface Builder中,故事板会自动显示与ContainerView相同的大小。

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

答案

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

另一答案

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

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

另一答案

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

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

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

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

希望这可以帮助!

另一答案

是的,我能够通过@rdelmar帖子实现您所寻求的灵感。您需要做的是将UITabBarViewController嵌入到容器视图中。然后以编程方式选择要呈现的控制器。您可能还想隐藏标签栏。

Container view indirectly containing more views

如果需要,还可以隐藏故事板文件中显示的标签栏

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

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

您可以通过调用self.tabBarController?.tabBar.hidden = truein viewDidLoad()隐藏视图控制器中的选项卡栏。

另一答案

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

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

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

另一答案

我也挣扎了很长时间。我有这样的情况,我有不同但类似的嵌入式表视图控制器,我想根据在视图控制器的segue中设置的参数显示。有效的方法是在视图控制器中放入带有IBOutlet的嵌入式容器。容器可以具有在IB中设置的大小约束。但是,不要在IB中进行任何嵌入。然后在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的子类,它是UITableViewController的子类。共同遗产让我使用一个“colorTableVC”变量来指向任何实例化的控制器。 (不完全必要)。但这确实避免了重复下面的代码来在heirarchy中添加视图并将新控制器固定到容器视图。在顶部,我在UIView上做了一个扩展,将视图固定到其父级边缘。

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

Embedded controller IB setup

以上是关于ContainerView具有多个嵌入segues的主要内容,如果未能解决你的问题,请参考以下文章

代表为零,使用故事板嵌入segue

嵌入在 containerView 中的 PageViewController 显示前一个视图的小边距

ContainerView 内的嵌入式 UICollectionView - 关于旋转问题

ContainerView中嵌入的iOS7 SplitviewController不旋转

Swift:如何将数据传递给嵌入在 ContainerView 中的 PageViewController?

在 UITableView 中嵌入的自定义 UICollectionView 中执行 Segue