本课会让你熟悉Xcode,这个让你写程序的工具。你将熟悉项目在Xcode中的结构,并且学会如何在基础项目组件间导航并使用它们。在本课中,你将为FoodTracker应用开始制作一个简单的用户界面(UI)并在模拟器中显示它。
当你完成时,你的应用看起来会像下面这样:
学习目标
在本课结束的时候,你将学到:
- 在Xcode中创建一个项目
- 识别使用Xcode项目模版创建的关键文件的目的
- 打开和切换项目中的文件
- 在iOS模拟器上运行应用
- 在storyboard中添加、移动UI元素,并改变它的大小
- 在storyboard中使用属性检查器编辑UI元素的属性
- 使用大纲(outline)视图查看和重排UI元素。
- 利用助手编辑器的预览模式预览storyboard上的UI
- 使用Auto Layout让UI能够自动适应用户的设备尺寸
创建一个新项目
Xcode包含多种为开发常见类型的iOS应用而准备的内建模版,例如games、tab导航的应用、表视图基础的应用。大多数的模版都预设了界面和源代码文件。本课,你将使用最基础的模版:Single View Application。
要创建一个新项目
1. 从应用程序目录中打开Xcode
如果这是你第一次启动Xcode, 它会问你是否同意用户协议,并下载额外的组件。按照这些屏幕提示操作,直到Xcode设置完成并准备启动。一旦Xcode启动完成,欢迎窗口就会出现。
如果项目窗口代替欢迎窗口出现,别担心,也许之前在Xcode中创建或者打开了一个项目。就使用下面步骤中的菜单项来创建项目。
2. 在欢迎窗口,点击“Create a new Xcode Project” (或者选择 File > New > Project)。Xcode打开一个新窗口,显示一个让你选择模版的对话框。
3. 在对话框的顶部选择iOS。
4. 在Application区域,选择Single View Application,然后点击Next。
5. 在出现的对话框中,使用下面的值来命名你的应用,并为项目选择额外的选项:
- Product Name: FoodTrackerXcode。使用你填写的产品名命你的项目和应用。
- Team:如果没有自动填充,则写None。
- Organization Name: 你的组织名或者你自己的名字。这一项也可以空着。
- Organization Identifier:如果有,就写。如果没有,就写com.example。
- Bundle Identifier:这个值根据产品名和组织标识符自动生成。
- Language: Swift
- Devices: Universal。一个通用的应用可以运行在iPhone以及iPad上。
- Using Core Data: Unselected.
- Include Unit Tests: Selected.
- Include UI Tests: Unselected.
6. 点击Next。
7. 在出现的对话框中,选择一个位置来存储你的项目,然后点击Create。Xcode在workspace window中打开新项目。
在workspace窗口中,你或许会看到一个错误图标,它的信息显示“Singing for FoodTracker requires a development team.” 这个信息的意思是你没有为iOS开发设置好Xcode。不过不用担心,完成本课不需要这个。让应用运行在模拟器上,你不需要开发team。
进一步探索
在iOS设备上运行应用之前,你需要设置一个有效的team,这样该应用才可以被签名。如果你是苹果开发者计划的成员,无论是个人还是成员组织中的一员,你都可以在这里选择team。否则,你的Apple ID会被当作个人team,使得你能在设备上运行应用。不过,在你向App Store提交应用之前,你需要加入苹果开发者计划。更多信息,选择Help > Xcode Help, 并搜索“Singing workflow”。
熟悉Xcode
Xcode包含了你创建应用所需的一切。它组织那些创建应用的文件和资源。它为代码和用户界面提供编辑器。还有,Xcode让你构建、运行、和调试你的应用—提供iOS设备模拟器和一个强大的一体化调试器。
花一点时间来熟悉Xcode工作空间主要部分。你将在本课程中使用以下窗口中标识的区域。不要现在就去了解所有的细节;每个区域的更多细节会在你用到的时候再详述。
运行iOS模拟器
因为你的项目基于Xcode的模版,所以基本应用程序环境已经自动设置好了。即使你不写任何代码,也可以在没有任何额外的设置的情况下构建并运行Single View Application模版。
为了构建并运行应用,使用Xcode中的iOS模拟器。模拟器让你了解应用在设备上运行时的外观和行为。
模拟器可以模拟很多种不同类型的硬件,所有不同屏幕尺寸和分辨率的iPad和iPhone,所以你可以模拟每个你想开发的设备。本课使用iPhone7选项。
在模拟器上运行应用
1. 在Xcode工具栏上选择Scheme会弹出一个菜单,选择iPhone 7。Scheme弹出菜单提供应用要运行之上的设备或模拟器的选项。确保你选择的是iPhone 7 Simulator,而不是iOS device。
2. 点击Xcode工具条左上角的Run按钮。
或者,选择Product > Run (或者,按下Command-R)。
如果你是第一次运行应用,Xcode会询问是否在Mac上启动开发者模式。开发者模式允许Xcode访问某些调试功能而无需输入密码。决定是否开启开发者模式并按照提示进行操作。
如果不开启开发者模式,则稍后可能会要求你输入密码。本系列课程假定开启了开发者模式。
3. 随着构建过程的完成,观察Xcode工具栏。Xcode会把构建进程显示在activity view中,它位于工具栏的中间位置。
Xcode构建应用结束后,模拟器将会自动开启。在第一次开启的时候需要一些时间。
模拟器以及指定的iPhone模式打开,并启动应用。初始时,模拟器显示应用的启动界面,随后它转换到应用的主界面。Single View Application模版在未更改的情况下,启动界面和主界面都是相同的。
现在,Single View Application 模版没有做什么,它只是显示了一个白屏。其他模版有更为复杂的行为。在你扩展模版的功能将之运用到应用上之前,理解它的用途是很重要的。没有任何修改的在模拟器中运行应用是开始理解开发的好方式。
通过选择Simulator -> Quit Simulator (或者按 Command-Q)退出模拟器。
查看源代码
Single View Application 模版有一点用来设置应用环境的源代码。首先,来看一下AppDelegate.swift文件。
查看AppDelegate.swift源码文件
1. 在navigator区域,确保project navigator是打开的。Project navigator显示项目中的所有文件。如果project navigator没有打开,点击导航选择器条上最左边的按钮(或,选择 View > Navigators > Show Project Navigator)。
2. 如有必要,点击FoodTracker文件夹旁边的三角,在project navigator中展开该文件夹。
3. 选择AppDelegate.swift。Xcode在窗口的主编辑区打开这个源码文件。
或者,双击AppDelegate.swift文件,它会在一个独立窗口中打开。
App Delegate 源文件
AppDelegate.swift源文件有两个主要功能:
- 定义AppDelegate类。App delegate 创建一个窗口,它用来绘制应用的内容,也用来对应用中的状态转换做出响应。
- 它创建了应用的入口(entry point),同时创建了一个将事件发送给应用的运行循环(run loop)。这项工作由UIApplicationMain属性(@UIApplicationMain)来完成,它位于文件的顶部。
使用UIApplicationMain属性相当于调用UIApplicationMain函数,并把AppDelegate类的名称作为代理类的名称传递。作为响应,系统创建一个应用程序对象。应用程序对象负责管理应用的生命周期。系统也创建了一个AppDelegate类的实例,并且把它分配给应用程序对象。最后,系统启动应用。
一旦你创建一个新的项目,AppDelegate类就会自动创建。除非你要做很不寻常的事,否则你应该使用由Xcode提供这个类,用它初始化你的应用、相应应用级别的事件。AppDelegate类遵守UIApplicationDelegate协议。这个协议定义了很多方法,用来设置应用、响应应用的状态改变、以及处理其他一些应用级别的事件。
AppDelegate类包含一个唯一的属性:window。
var window: UIWindow?
这个属性存储应用的window的引用。这个window相当于应用的视图层级的根视图。应用的内容都绘制在此之上。注意,这个window属性是一个optional,意思是有时候它可能没有值(是nil)。
AppDelegate类也包含了下面这些委托方法的存根实现(stub implementation,可以理解为空实现)。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) —> Bool
func applicationWillResignActive(_ application: UIApplication)
func applicationDidEnterBackground(_ application: UIApplication)
func applicationWillEnterForeground(_ application: UIApplication)
func applicationDidBecomeActive(_ application: UIApplication)
func applicationWillTerminate(_ application: UIApplication)
这些方法让应用程序对象和应用代理之间可以进行交流。在应用状态转换期间,例如程序启动、转换到后台、应用被终止等,应用程序对象调用相应的委托方法,给应用程序一个做出响应的机会。你无需做任何事来保证这些方法在正确的时刻被调用,因为这些工作应用程序都帮你做了。
每个委托方法都有默认行为。如果让这些方法仍然空着,或者从AppDelegate类中删除它,只要这些方法被调用的时候,这些默认行为依然会起作用。或者,你可以添加自己的代码到存根方法中,代码所定义的自定义行为会在这些方法被调用的时候执行。
模版也提供了每个存根方法的注释。这些注释描述了应用程序如何使用这些方法。你可以使用这些存根方法和注释,作为设计许多通用的应用级别行为的蓝图。
在本课中,将不会用到自定义委托方法中的代码,索尼你不需要改变任何AppDelegate.swift中的文件。
视图控制器源文件
Single View Application模版还有另外一个源代码文件:ViewController.swift。在project navigator中选择ViewController.swift来查看它。
该文件定义了一个名为ViewController的UIViewController的子类。现在,这个类只是简单的继承了所有UIViewController定义的行为。要覆盖或者扩展行为,你需要重写UIViewController定义的方法。
就像你在ViewController.swift文件中看到的那样,模版重写了viewDidLoad()和didReceiveMemoryWarning()两个方法;然而,模版的存根实现方法还没有做任何事,除了调用这些方法的UIViewController版本。你可以添加自己的代码来自定义视图控制器对这些事件的响应。
尽管模版有didReceiveMemoryWarning()方法,但是你在本系列课程中用不到它,所以删掉它。
就像你在ViewController.swift文件中看到的,这个模版的实现文件重写了viewDidLoad()和didReceiveMemoryWarning()方法;但是,这个模版的存根实现方法还没有做任何事。现在,ViewController.swift的代码看起来应该是这个样子:
class ViewController: UIViewController {
override func viewDidLoad() {
super.ViewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
}
在h的课程中,你将会在这个源代码文件里写代码。
(未完待续......)