最小的App
纯粹使用代码(而不需要Storyboard)来创建一个iOS App是可行的。
首先做些操作性的工作:
- 打开Xcode
- 创建一个Single View App。安装工程向导的要求一步步的做完,其中需要特别留意的是,选择Swift语言
Xcode会进入主要编辑界面。随即打开AppDelegate.swift文件,覆盖原来的源代码为如下代码:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window : UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
window = UIWindow()
window!.rootViewController = UIViewController()
window!.rootViewController!.view.backgroundColor = .blue
window!.makeKeyAndVisible()
return true
}
}
运行后发现手机(或者仿真器)满屏的蓝色背景就说明成功了。
分析
尽管程序代码并不长,但是知识点还是比较多的。一起来看看代码。
我们需要导入UIKit:
import UIKit
UIKit是一个框架,用来构建用户界面、响应用户交互和系统事件。制作一个App,引入UIKit常常是第一件工作。
接下来要看的是@UIApplicationMain。它是一个属性标记,它的存在指明接下来的类是整个App的入口类,代码将会首先从此类开始执行。标记了@UIApplicationMain的类,应该实现协议UIApplicationDelegate。
接着查看AppDelegate类。它实现协议UIApplicationDelegate。这意味着AppDelegate应该实现协议UIApplicationDelegate期望的数据对象:
optional public var window: UIWindow? { get set }
也应该实现了此协议中期望的函数:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
这样此函数就被设置为App的程序入口点了。UIKit就会在完成App启动调用此函数,App可以在此实现自己的初始化逻辑。
在本案例中的自定义初始化逻辑是:
- 创建UIWindow实例并把它赋给window成员。
- 创建UIViewController的实例,并把它赋给window.rootViewController成员
- 为了可视化的看到我们的工作成果,我们设置UIViewController.view的背景色为蓝色
这样,我们完成了最基本的一个UI界面。
UIWindow代表一个Window,通常在一个App中至少会有Window,它构成了整个App的用户界面的容器。Window并没有任何外观形象,实际的可见界面由其内的View来展示。
UIView代表一个View,它们是构建界面的基本构造块,它定义了一个屏幕上的矩形区域,并且管理此区域的内容和用户交互。Window通过属性rootViewController.View开始关联根视图,根视图和其子视图,以及子视图的子视图一起构成层次化的视图树。UIView的使用是非常广泛的,实际上按钮(UIButton)、标签(UILabel)等控件都是视图的子类。
类AppDelegate的名字中的Delegate常常引人好奇。Delegate是一种简单而强大的设计模式,可以让其中一个对象遵照指定的协议委托一部分功能给另外一个对象。在此案例中,关于委托牵涉到了两个类包括UIApplication、AppDelegate,以及一个协议为UIApplicationDelegate,UIApplication委托事件遵照协议UIApplicationDelegate,委托事件给AppDelegate。这里的委托事件体现为此函数:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
当App启动完成后,UIApplication会调用此函数以便开发者可以完成自己的启动业务逻辑。协议UIApplicationDelegate还有更多可以实现的事件函数,可以通过官方手册了解它的更多资料。