我知道我可以手动调整界面生成器中其他 ViewControllers 的大小,但我想要由嵌入式转场提供的自动调整大小。如果有其他方法可以做到这一点,也可以。视图在 viewDidLoad 上加载也没问题 - 如前所述,显示的 ViewController 可能会根据按下的按钮改变。
不,无法将多个嵌入式segue指向同一个容器视图。在IB中完成所有设置的一种方法是使嵌入控制器成为UITabBarController(隐藏选项卡栏)。然后,您可以在选项卡中拥有任意数量的控制器,并使用UITabBarController的selectedIndex属性在代码中切换到它们。
是的,我能够实现你所想要的,受 @rdelmar 的帖子启发。你需要做的是将UITabBarViewController
嵌入到你的容器视图中。然后通过编程方式选择你想要展示的控制器。你可能还想隐藏选项卡栏。
如果你愿意,你也可以在Storyboard文件中隐藏选项卡栏。
你可以通过继承UITabBarController来选择你想要展示的视图控制器:
override func viewDidLoad() {
super.viewDidLoad()
self.selectedIndex = 1
}
您可以在视图控制器中调用self.tabBarController?.tabBar.isHidden = true
来隐藏选项卡栏,具体位置是在viewDidLoad()
函数中。viewDidLoad()
中放置self.tabBarController?.selectedIndex = 5
,但它不起作用): - Arnaldo我知道这个问题有点老,但是如果你还在寻找答案,或者其他人发现了这个问题,我希望能够回答。我曾经遇到过类似的问题,后来解决了。
简而言之,你需要三层:
- 一个外部视图控制器("ExternalViewController")
- 一个视图控制器管理器("ViewControllerManager")
- 你实际想要在它们之间切换的子视图控制器("ChildViewController")
在ExternalViewController中使用一个容器视图,并使用嵌入式segue将其连接到ViewControllerManager。然后,ViewControllerManager会以编程方式持有其他ChildViewControllers,如此Apple文档中所述,特别是添加和删除子项的部分。
当你添加一个子视图控制器时,将其框架设置为与ViewControllerManager的框架相同(因为你正在ViewControllerManager内部执行此操作,所以将子项的框架设置为self.view.frame)。当然,你还需要一些逻辑和外部控件在ExternalViewController内部进行切换。
希望这可以帮助你!
-shouldPerformSegueWithIdentifier:sender:
实现的。我有一个容器,传递了一个对象,根据此对象的类型来决定显示哪个子视图控制器。-performSegueWithIdentifier:sender:
手动执行嵌入segue,但这也可能是一种可能性。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)
}
}
}
}
[self performSegueWithIdentifier:]
执行正确的segue。至少,这样做可以保持自动调整大小、在IB中保持连接和保持prepareForSegue
逻辑。 - Carlos P