如何在另一个视图中加载一个视图?
让我解释得更好。我有一个带分段按钮的视图。然后,用户选择一个段。此时,应该在主视图中加载不在主视图中的特定视图。
当前,这些外部视图显示在视图上方的栏中(以及退出和第一响应者)。
理论上,我可以将所有视图加载到同一位置,将所有视图隐藏起来,然后根据用户输入显示正确的视图。不幸的是,这将使在这些外部视图中编辑内容变得非常困难,因此必须有更好的方法。
有什么建议吗?
答案 0 :(得分:0)
由于您似乎正在使用Storyboard,并且希望保持视图易于编辑,所以我建议采用以下结构:
在主视图中,将容器及其相应的自动布局约束添加到主视图。
然后,创建两个.xib文件,其中包含您的两个视图及其设计。在此.xib内部,设置内部元素的约束。
然后,在主视图的视图控制器中,使用按钮的出口功能将两个.xib文件实例化为容器的子视图。
if let customView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil).first as? CustomView {
contentView.addSubview(customView)
customView.setTranslatesAutoresizingMaskIntoConstraints(false)
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["view":customView]))
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]-0-|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["view":customView]))
}
(此代码的信用凭证转到:http://www.thomashanning.com/loading-a-view-from-a-xib/)
如果您需要子视图与父视图进行通信,则只需在子视图中添加委托函数,然后在实例化新的.xib时将主视图设置为委托。
您可以在How do I create delegates in Objective-C?
中找到有关在Objective-c中与代表合作的更详细的说明。通过使用这种方法,您可以通过编辑.xib文件来轻松地在情节提要模式下编辑子视图,同时,这使得在父视图中实例化这些视图非常简单明了。