将多个单独的 Swift 文件加载到主容器视图中
Posted
技术标签:
【中文标题】将多个单独的 Swift 文件加载到主容器视图中【英文标题】:Load Multiple Separate Swift Files into Main Container View 【发布时间】:2015-10-15 00:45:49 【问题描述】:好的,所以我会提前道歉,但我对 Swift 和 ios 开发完全是个菜鸟,但我真的很想学习编码。我在网上关注了很多教程等,但似乎找不到我遇到的这个问题的答案。必须有一个简单的解决方案,因为这似乎不是一个非常困难的问题,但谷歌并不是我寻找答案的朋友。我不想使用故事板,因为我想学习真正的肉和土豆。我正在使用 OS X 10.11,Xcode 7,为 iOS 9 编写应用程序,通用。
因此,我设计了一款日历应用程序,与其他基于网格的日历相比,它具有非常独特的显示、UI 和功能。我有一个 UIView 我想成为一个容器来保存我需要的其他视图并将它们拉到容器视图中。我拥有的文件是包含的 ViewController.swift 和我的自定义文件 ContainerView.swift HeaderView.swift、CalView.swift 和 CalDetailView.swift。我为每个文件设置了类,HeaderView 是一个基本的 UIView,CalView 是一个水平 UIScrollView,可以为不同的日历视图(如周、月、日、年等)启用分页。 CalDetailView 也是一个水平的 UIScrollView,它将向用户显示事件详细信息,也是用户编辑、添加事件等的主要操作区域。
目前 ContainerView 加载得很好,我可以在那里做任何我想做的事情,并且可以毫无问题地创建这些其他子视图,但只能在 ContainerView 文件中。为了我的理智,我想将这些区域分成不同的文件,并将它们作为具有 AutoLayout 和所有内容的子视图添加到 ContainerView UIView 中,就像我可以在 ContainerView 文件中做的那样,但它会很大,我不想要那个。
我相信正确的方法是在主 VC 的 viewDidLoad() 方法下添加这些子视图并在 VC 文件中创建我的 AutoLayout 约束,然后我只想在 ContainerView 文件中加载我的子视图并构建屏幕。单独的 subView 文件将包含我所有的绘图代码和视图的触摸事件等。
这是我想要完成的简单线框图... 整个窗口都是 ContainerView.swift 剩下的,是 ContainerView 的子视图。
WireFrame
【问题讨论】:
【参考方案1】:这个问题有点开放且不具体,但现在让我们忽略这个(这是你的第一次),以后请更具体,这是教程可能会更好地提供的那种回应。您将有足够的工作要做,而无需避免使用情节提要 - 随意使用它们。
无论如何都可以。
给定一个 UIView 子类 MyView,在您的主视图控制器中:
override func viewDidLoad()
super.viewDidLoad()
....
let myView = MyView()
self.view.addSubView(myView)
myView.frame = ... OR <SET CONSTRAINTS>
....
基本上,您将初始化这些视图子类并根据需要添加它们。
【讨论】:
感谢您在新手上轻松,我很感激。我尽量做到具体。不幸的是,这没有奏效。我添加了建议的代码,但在 self.addSubView 行出现错误,显示“ViewController 类型的值没有名为 addSubview 的成员”。我在 Apple 文档中查找了它,它只是 UIView 的成员。我尝试在那里添加它,没有骰子。我没有收到错误,它构建得很好,但视图没有显示。 谢谢。我不再收到错误并且构建良好,但视图不可见。我翻遍了 Apple 的文档,试图找到一个解决方案,说明它为什么不可见,并认为它没有正确分层。所以我添加了 bringSubviewToFront() 方法,没有骰子。然后我发现它没有正确初始化,所以我按照Apple的init方法初始化视图,它仍然没有显示。当我取出我的绘图代码并将其放入 VC 时,没问题。此外,当我将它放入 ContainerView 文件时,它也会显示。它似乎不知道它的存在,但没有错误。 好的,明白了。我没有在 VC 文件中设置界限,因为它们在视图文件中存在。我将约束移到 VC 文件上,将我的绘图代码保存在单独的视图文件中,它运行良好。现在,弄清楚自动布局的怪癖......有趣的东西。谢谢米切尔,非常感谢您的帮助。以上是关于将多个单独的 Swift 文件加载到主容器视图中的主要内容,如果未能解决你的问题,请参考以下文章
reloadData 不会将完成处理程序的 dispatch_async 中的表视图重新加载到主线程
将数据从两个单独的 Firebase 节点加载到一个表格视图单元格中
Firebase - iOS Swift:使用从两个单独的子节点检索到的数据加载表格视图单元格