我有一个要在IB中其他场景上重用的视图。该视图包含用户详细信息,例如名称,头像,描述,一些按钮等。这些视图完全相同,并且内部具有相同的元素。现在,很难跨场景复制它们,修复约束,然后一遍又一遍地编码相同的元素。它效率不高,很耗时间。理想情况下,我想在IB上看到这些视图,所以我不想在没有任何可视化的情况下以编程方式进行所有操作。有没有一种方法可以使它更好,以便我可以重复使用它?
答案 0 :(得分:0)
不仅痛苦,而且重建相同组件的设计很差。我将创建一个xib文件,创建后备swift或obj-c文件。像往常一样对所有插座进行接线。
在每个所需的视图控制器或视图中,对其进行初始化并将其添加为子视图。
我很快会做类似的事情:
if let subview = Bundle.main.loadNibNamded("SpecialView", owner: self, options: nil)?.first as SpecialView {
// set constraints
containerView.addSubView(subview)
}
答案 1 :(得分:0)
可以。我最近做了这个。我从VC
的子项NavigationController
开始,然后将视图推到NavigationController
范围之外的视图堆栈上,因此新视图没有{ {1}}。
假设您使用的是故事板,则将创建包含所有动作和输出的视图,并将它们链接到其自己的类文件。还为情节提要视图指定一个ID。然后,您需要将控制器定义为常量,并在需要使用它时将其推入视图堆栈。
NavigationBar
要关闭该视图,请在 // define the controller
let controller = self.storyboard!.instantiateViewController(withIdentifier: "YourCustomControllerID") as! YourCustomController
// if you want to pass data to the new controller
// first you must define some class variables in that class then you do this:
controller.image = whateverImage
// then you push it to the stack like this
self.navigationController!.pushViewController(controller, animated: true)
中呼叫dismiss(animated: true, completion: nil)
答案 2 :(得分:0)
是的,有几个。
使用LoadNibNamed如cnbecom所述加载自定义视图。所有者是代理类,意味着它仅表示“任何内容”。所有者就像是已安装但在您创建类之前才建立的连接,如果可以的话。
另一种方法是在代码中创建自定义视图,而不是使用单独的笔尖,而只需重新创建视图并更改主Xib / Container Xib中的类型。您将不得不复制/粘贴笔尖,通过在复制之前将其嵌入到视图中,可以更加轻松地进行操作。即使有限制,此方法也更容易。钩住所在的Xib中的插座。
第三是纯代码。这是制约因素只是额外的工作,没有好处的主要原因之一。
第四,是将笔尖装载到容器中。基本上,它通过AwakeFromNib方法将自身加载为自己的类型。然后,您必须将插座连接到内部Xib,以实现Owner已更改。如果您可以可视化白色正方形内的内容,则此方法很有用。
我也从不使用约束。几次会有所帮助,在layoutSubviews或类似代码中编写帧x,y的基本单行代码仍然更快。自定义视图和手动使用layoutSubviews将节省大量时间。弹簧和支柱非常强大,iOS缺乏CSS媒体查询来获取完整的布局更改,只是具有移动约束的方式(修改现有布局,如果完全更改两种不同设备类型的菜单则无济于事)。
为平板电脑创建不同的xib,然后编写一个加载函数,测试是否在平板电脑上并附加一个前缀,一旦您自定义加载,就会为您提供一个了不起的系统。
无论如何,请尽情享受!我相信这个问题是一个轻微的重复,因为您的标记是对自动布局的无奈,但是您真正的问题是“如何在Swift中加载自定义视图”,这一问题已经得到了很多回答。
答案 3 :(得分:0)
有两种方法:
以编程方式(或可能涉及编写代码) 创建一个自定义视图,并包含所需的所有接口设置(包括数据),并将其添加到希望显示的每个控制器中
利用Container view
的优势,像本How to get stable results with TensorFlow, setting random seed
这是我在第二个示例中所做的:
Container View
NavigationController
并将其嵌入Container View