在IB或以编程方式重用不同场景上的视图

时间:2018-06-21 18:38:00

标签: ios swift uiview interface-builder

我有一个要在IB中其他场景上重用的视图。该视图包含用户详细信息,例如名称,头像,描述,一些按钮等。这些视图完全相同,并且内部具有相同的元素。现在,很难跨场景复制它们,修复约束,然后一遍又一遍地编码相同的元素。它效率不高,很耗时间。理想情况下,我想在IB上看到这些视图,所以我不想在没有任何可视化的情况下以编程方式进行所有操作。有没有一种方法可以使它更好,以便我可以重复使用它?

4 个答案:

答案 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)

有两种方法:

  1. 以编程方式(或可能涉及编写代码) 创建一个自定义视图,并包含所需的所有接口设置(包括数据),并将其添加到希望显示的每个控制器中

  2. 利用Container view的优势,像本How to get stable results with TensorFlow, setting random seed

  3. 一样,将其他内容加载到另一个控制器中

这是我在第二个示例中所做的:

  • 创建一个基本控制器,其中包含我希望始终显示的视图
  • 添加视图并根据需要对其进行自定义
  • 在同一控制器中添加Container View
  • 添加一个NavigationController并将其嵌入Container View

Github repo