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

问题描述 投票:0回答:4

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

ios swift uiview interface-builder
4个回答
0
投票

不仅是痛苦,重建相同组件的设计也很差。我会创建一个xib文件,创建后备swift或obj-c文件。像往常一样连接所有插座。

在您需要的每个视图控制器或视图中,初始化它并将其添加为子视图。

在swift中,我会做类似的事情:

if let subview = Bundle.main.loadNibNamded("SpecialView", owner: self, options: nil)?.first as SpecialView {

    // set constraints
    containerView.addSubView(subview)
}

0
投票

是的你可以。我最近这样做了。我开始在VC,这是一个NavigationController的孩子,并将视图推到了NavigationController范围之外的视图堆栈,所以新视图没有NavigationBar顶部。

假设您正在使用故事板,您将使用其所有操作和出口创建视图,并将它们链接到自己的类文件。同时为故事板视图提供ID。然后,您需要将控制器定义为常量,并在需要时将其推送到视图堆栈。

 // 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)中调用YourCustomController


0
投票

是的,有一些。

cnbecom使用LoadNibNamed加载自定义视图。所有者是代理类,意味着它只代表“任何东西”。所有者就像是一个适合的连接,但是在你创建类之前不会创建,如果这有意义的话。

另一种方法是在代码中创建自定义视图,但是您只需重新创建视图并更改主Xib / Container Xib中的类型,而不是使用单独的nib。您必须复制/粘贴笔尖,并且在复制之前将其嵌入视图中会更容易。即使有约束,这种方法也更容易。连接包含Xib中的插座。

第三是纯粹的代码。这是限制只是额外工作,没有好处的一个主要原因。

第四,是加载Nib但是在容器内。基本上它通过AwakeFromNib方法将自身加载到自己的类型中。然后,您必须将插座连接到内部Xib,以实现所有者更改。如果您可以看到白色方块内的内容,则此方法很有用。

我也从不使用约束。有几次它会有所帮助,在layoutSubviews或类似的代码中编写基本的单行x,y代码仍然会更快。自定义视图和手动使用layoutSubviews将为您节省大量时间。弹簧和支柱非常强大,iOS缺少CSS媒体查询以进行完整的布局更改,只是有方法可以移动约束(修改现有布局,如果完全针对两种不同的设备类型更改菜单则没有用)。

为平板电脑创建不同的xib,然后编写一个加载功能,测试是否在平板电脑上并附加前缀,一旦你自定义加载,将给你一个惊人的系统。

无论如何,享受!我相信这个问题有点重复,因为你的标记是自动布局的挫败感,但你真正的问题是“如何在Swift中加载自定义视图”,这已经得到了很多回答。


0
投票

有两种方法:

  1. 以编程方式(或可能涉及编写代码)创建自定义视图并包括您需要的所有界面设置,包括数据并将其添加到您希望显示的每个控制器
  2. 利用Container view来加载另一个控制器中的其他内容,就像在这个Github repo中一样

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

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.