另一则关于以编程方式创建视图的iOS帖子!

我知道我知道。 关于为什么为什么以编程方式创建视图比通过Storyboards / Xibs进行创建更好或过时(取决于作者),有许多类似(已读:相同)的文章。

幸运的是,我不会讲解为什么编程视图优于Storyboards或Xibs。 为什么?

因为这三种方法都完成同一件事:创建iOS应用程序的用户界面。

关于这个话题将有无休止的辩论。 每种方法都有其自身的优势/劣势,每个人都有自己的偏好。 但更重要的是,只要iOS存活,每种方法都会存在。

正如我的金融教授曾经说过的:“前往拿骚街的方式不止一种。”

为什么我喜欢程序化视图

就个人而言,当我切换到以编程方式创建视图的方式比使用Storyboards或Xibs时,我了解的更多有关UIView及其实例/类方法的知识。 Storyboard / Xibs并没有真正教会我有关UIKit的内部工作的知识,就像它调用某些UIView方法时一样。 一切都是魔术。 作为软件开发人员,不知道事情是如何运作的,这是不行的。 就我个人而言,如果我不知道事情在软件开发中的工作方式,那将使我无休止。 我睡不着了。

在仔细阅读了Apple文档,Google,StackOverflow和iOSProgramming subreddit之后,我真的提高了对以下方面的理解:

  1. UIKit / UIView
  2. 自动版式
  3. 迅速
  4. 面向对象编程

此外,如果以编程方式创建视图,则可以更好地控制使用用户界面可以执行的操作。 (谁不喜欢他们的所作所为的绝对控制权?)

最后(也是我认为最重要的一点),您创建的UIView子类的每个属性都可以在一个.swift文件中看到。 您不必单击Interface Builder中的每个UIView即可查看其属性设置。 您修改的所有内容都是明确的。

我为什么要为一个已经有很多文章的话题发帖?

我已经阅读了许多关于iOS中程序化视图的文章/教程,但没有一个真正遵循Model-View-Controller模式。

这些教程很简短, UIView代码位于视图控制器中(您永远都不应在视图控制器中创建视图)。 我基本上不得不猜测如何将UIView代码从视图控制器中分离出来,但是幸运的是,在Google上进行了无数次搜索之后,我发现了一些可以帮助我入门的建议:

应该为每个视图控制器创建一个UIView子类,实质上是用Swift而不是XML编写的Xib。

这篇文章的目标

让读者(您)知道如何以编程方式(使用SnapKit)编写视图,而又不会破坏Model-View-Controller设计模式并防止创建Massive View Controller。

这不是初学者友好的教程

我假设您知道Xcode for Swift中单视图应用程序的基本项目结构,并且知道什么是Cocoapods以及如何使用它安装Pod。 您应该对保留周期有所了解,并对值类型和引用类型有所了解。

话虽如此,让我们开始吧!

教程! —基本设置

让我们从每个人最喜欢的视图开始进入编程视图:“登录身份验证”屏幕!

但是在开始之前,让我们从基本设置开始。

  1. 创建一个新项目:Single View Application
  2. 删除Main.storyboard(放入垃圾箱并永久删除)
  3. 转到info.plist并删除“ Main Storyboard File base name”
  4. 将ViewController.swift重命名为LoginVC.swift
  5. 将类ViewController重命名为LoginVC

11.使它等效于IBOutlets。

因此,如果您使用情节提要/ xib,则必须在某一时刻编写如下代码:

  @IBOutlet弱var emailTextField:UITextField! 

并从情节提要/ xib连接它

程序化视图可以执行与面向对象编程类似的操作,并且更类似于🙂

将其添加到LoginVC内部(相当于将IBOutlets放入视图控制器中):

不好了! 强迫降落!

不用担心

我们在loadView方法LoginVCview属性实例LoginVC LoginView的实例,因此,这种强制向下转换是安全的,并且将成功。 我们还使它们成为弱引用,以避免任何保留周期。

IBActions呢? 我们可以通过程序制作这些吗? 答案:是的。

IBActions只是目标操作机制

12.在LoginVC创建一个与loginButton关联的函数

因此, loginButtonPressed将是用户按下loginButton时调用的操作。 我们如何将此功能连接到loginButton

viewDidLoad这样做:

恭喜! 您已通过编程将函数连接到UIControl!

现在在模拟器中运行它,它应该可以工作🙂

因此,LoginVC中的最终代码应为:

结论!

我希望您觉得本教程有趣且有益。 我绝对很开心。

这是回购的链接,以供将来参考!

如有任何疑问,请置评。 这是我第一次制作iOS教程。 请让我知道我可以改进的地方。