如何在 Swift 中以编程方式创建新的 UIViewController

Posted

技术标签:

【中文标题】如何在 Swift 中以编程方式创建新的 UIViewController【英文标题】:How to programmatically create a new UIViewController in Swift 【发布时间】:2015-08-03 20:39:59 【问题描述】:

我是 ios 开发和 Swift 领域的新手,但遇到了问题。当我的应用程序启动时,它会连接到一个 Web 服务,并下载一个包含“帖子”信息的 JSON 字符串,然后,它应该将第一个帖子加载到第一个视图中。之后,用户可以向左或向右滑动以加载下一篇文章的新视图。我想我可以使用这样的东西来做到这一点:

let nextView:ViewControllerName = ViewControllerName();
self.presentViewController(nextView, animated: true, completion: nil)

但是,这表明我已经创建了另一个 UIViewController 并准备好了,但是由于我正在动态加载数据,因此我必须按需创建新视图并创建不定数量的视图。

那么,我怎样才能创建一个新的UIViewController,向其中添加控件,添加控件(包括自定义控件),并使用 Swift 代码中的所有数据填充控件?我可以以某种方式将它与故事板集成吗?

【问题讨论】:

【参考方案1】:

您可以拥有 一个 UIViewController,其中包含一个分页滚动视图 (UIScrollView),其中包含要显示的视图。

当用户滑动时,您只需使用适当的数据填充要显示的视图。一种常见的模式是在滚动视图中有 3 个视图,并且已经预加载了下一个和上一个视图。

【讨论】:

如果我有 3 个视图,当用户到达最后一个时会发生什么? 另外,通过阅读:developer.apple.com/library/ios/documentation/UserExperience/… 似乎UIScrollView 用于在图像太大时滚动,而不是在多个视图之间滚动。【参考方案2】:
    将您的 JSON 响应转换为 UIViewControllers 数组(factory 模式)。对于每个项目,您可以创建类似 - (UIViewController *)viewControllerFromObject:(MyObject) object 的内容 安装ISScrollViewPageSwift 集成它

【讨论】:

但是如何给这些UIViewControllers添加控件 您有两种方法.. 1) 创建一个 XIB 并自定义它.. 并以编程方式实例化它.. 2) 不要使用 XIB 并实例化 UIViewControllers 并添加/自定义所有子视图(图像,文本, view.. etc..) .. 对于每种方法,您都可以遵循很多很多这样的教程:makeapppie.com/tag/xib-in-swift 如果响应中有 100 多个项目,我会遇到严重的性能问题吗? 不知道,你需要测试一下。【参考方案3】:

搜索“UIPageViewController”教程。您还可以使用第三方库,例如“iCarousel”,这样会更容易一些。

https://github.com/nicklockwood/iCarousel

但是:通过网络异步按需动态创建新视图会造成非常糟糕的用户体验。在 iOS 上,每个人都习惯于非常快速和流畅的用户体验——只要用户滑动,他就想立即看到下一个视图。但网络请求需要 0.5 秒 - 10.0 秒,具体取决于您的网络连接。如果您预加载一些页面以使它们已经在内存中会更好。一旦用户查看了一些预加载的页面,您就可以预加载更多的页面......等等......无限期地。

【讨论】:

以上是关于如何在 Swift 中以编程方式创建新的 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式创建 SplitViewController?

如何在 ios swift 中以编程方式创建自动布局等宽约束?

如何在ios swift中以编程方式创建自动布局等宽度约束?

如何在 Swift 中以编程方式旋转一组按钮?

如何使用 Swift 在 iOS 中以编程方式进行 segue

如何在 Swift 中以编程方式从 UIView 中删除安全区域?