Build a Basic UI 构建基本的用户界面

        这节课让你熟悉Xcode,它是你编写应用程序的工具。你会熟悉Xcode的项目结构和学习如何浏览和使用之间的基本项目组成。在这一课,你会开始做一个简单用户界面(UI)的FoodTracker App在模拟器里查看它。当您完成时,您的应用程序将有一个餐点的标签名称,一个可改变餐点的名称文本字段,和一个可重置名称的按钮。 


学习目标

在课程结束时,你将能够:

        *在Xcode创建一个项目

        *认识使用Xcode 项目模版创建关键目标文件

        *打开和切换项目中的文件

        *在iOS模拟器中运行应用程序

        *在故事板上添加、移动和调整用户界面元素的大小

        *使用属性检查器编辑在故事板中的UI元素的属性

        *使用大纲视图查看和重排UI元素

        *使用助理编辑预览模式预览故事板UI

        *使用自动布局来设置一个自动适应用户设备大小的UI。


创建一个新项目

        Xcode开发iOS应用程序包括常见的几种内置的应用程序模板,如游戏,以标签为基础的导航应用程序,和应用程序视图表。大多数这些模板有预先设定的界面和源代码文件。对于这一课,您将从最基本的模板开始:单视图应用程序。

着手创建一个新项目:

        1.从应用程序目录里打开Xcode。

        如果这是您第一次启动Xcode,它会问你是否同意用户协议和下载附加组件。按照提示通过这些屏幕到Xcode完全建立和准备开启。

        当Xcode启动,直到欢迎窗口出现。


         如果出现的是一个项目窗口而不是欢迎窗口,不要担心你可能在打开Xcode以前就创建或打开一个项目。只需在下一步的菜单项中创建项目。

        2.在欢迎窗口,点击“创建一个新的Xcode项目”(或选择文件>新建>项目)。Xcode打开一个新窗口,显示一个对话框,选择一个模板。

        3.在对话框顶部选择iOS。

        4.在应用程序部分,选择单视图应用程序,然后单击Next。


5.在出现的对话框中,使用列出的值命名您的应用程序,并为项目选择其相应选项:

        * 产品名称:FoodTracker (Xcode用你输入的产品名称命名你的项目和应用程序。)

        *团队:如果没有自动填充,将团队设置为无。

        *组织名称:您组织的名称或您自己的名称。你可以留空。

        *组织标识符:如果您有一个组织标识符。如果没有,你可以用com.example.

        *绑定标识符:此值是根据产品名称和组织标识符自动生成的。

        *语言:Swift。

        *设备: Universal (一个Universal的应用程序可以同时在iPhone和iPad上运行。)

        *Use Core Data: Unselected.

       *Include Unit Tests: Selected.

       *Include UI Tests: Unselected.


6.点击 Next。

7.在出现的对话框中,选择要保存项目的位置并单击“创建”。

Xcode 在 workspace window(工作区窗口)里打开新项目.


        工作区窗口(workspace window)可能会有一个消息,说“FoodTracker需要开发团队签名的错误图标。”这样的警告意味着你没有成为iOS开发者,但是不要担心,你可以不做,完成这些课程。您不需要开发团队的签名你可以在模拟器中运行应用程序。


熟悉Xcode

        Xcode包括一切你需要创建一个应用程序。它组织了创建应用程序的所有文件和资源。它为代码和用户界面提供编辑器。另外,Xcode让您建立,运行和调试你的应用程序提供模拟器的iOS设备和功能强大的集成调试器。

花一些时间来熟悉Xcode工作的主要部分:

        *Navigator area. 提供对项目各个部分的快速访问。

        *Editor area.编辑源代码、用户界面和其他资源。

        *Utility area. 提供有关选定项目和访问现成资源的信息。公用事业区分为两部分。顶部是“检查面板”,在这里您可以查看和编辑关于导航器或编辑区域中选择的项的信息。底部是“库”窗格,您可以在其中访问用户界面元素、代码片段和其他资源。

        *Toolbar. 用于构建和运行应用程序,查看运行任务的进度,以及配置工作环境。


不要担心被这么多的术语搞混了,当需要使用时,每个区域都会被详细地描述。


运行iOS模拟器

因为通过你的项目你在一个Xcode模板的基本的应用环境自动为你设置。即使您没有编写任何代码,也可以在没有任何附加配置的情况下构建和运行单个视图应用程序模板。

建立并运行你的应用程序,使用iOS模拟器应用程序,包括在Xcode。模拟器提供了一个你的应用程序在设备上运行时的外观和行为的概念。

模拟器可以为iPad和iPhone设计各种不同类型的硬件,所有屏幕尺寸和分辨率,这样你就可以在你开发的每台设备上模拟你的应用程序。在这一课中,使用iPhone 7选项。

在模拟器中运行你的应用程序

        1.在该方案中的弹出菜单在Xcode工具栏,选择iPhone 7。(该弹出菜单让您选择模拟器或设备,你想运行你的应用程序。确保您选择的是iPhone 7模拟器,而不是iOS设备。)




2.点击位于Xcode工具栏的左上角运行按钮。


另外还可以选择Product > Run (or press Command-R).

        如果你是第一次运行一个应用程序,Xcode会询问您是否要启用开发者模式在您的Mac。开发者模式允许Xcode访问某些调试功能,而无需每次输入密码。决定是否希望启用开发人员模式并遵循提示。


        如果您选择不启用开发人员模式,稍后可能会要求您输入密码。本课程假设开发人员模式已启用。

3.观察Xcode工具栏生成过程。(Xcode显示构建过程活动中观察的消息,在中间的工具栏上。)

Xcode完成项目创建后,系统自动启动。第一次启动可能需要几分钟的时间。

模拟器在您指定的iPhone模式下打开,然后启动应用程序。最初,模拟器显示应用程序的启动屏幕,然后切换到应用程序的主界面。在未修改的单视图应用程序模板中,启动屏幕和主界面是相同的。


现在,单视图应用程序模板做得不多,它只显示一个白色屏幕。其他模板具有更复杂的行为。在扩展应用程序之前,了解模板的用法是很重要的。在模拟器中运行您的应用程序而不进行修改是开始理解的好方法。

退出模拟器选择 Simulator > Quit Simulator (or pressing Command-Q).


预览源代码

单一视图应用程序模板附带了一些设置应用程序环境的源代码文件。首先,在AppDelegate.swift文件看一看。

查看AppDelegate.swift源文件

       1.确保项目导航器在导航区域中打开。(项目导航器显示项目中的所有文件。如果项目导航打不开,请在导航栏最左边的按钮选择。另外也可以选择View > Navigators > Show Project Navigator.)


2.如果有必要,可以通过点击它旁边的三角形打开FoodTracker在项目浏览器中的文件夹。

3.选择AppDelegate.swift。(Xcode在主窗口的编辑区打开源文件。)


Alternatively, double-click the AppDelegate.swift file to open it in a separate window.

The App Delegate Source File  应用程序委托源文件

AppDelegate.swift源文件有两个主要功能:

        *首先它定义了你的AppDelegate的类,app delegate 创建应用程序内容的窗口,并提供响应应用程序中状态转换的位置。

        *它为你的应用程序创建一个入口点和一个为你的应用程序提供输入事件的运行循环。这项工作是由uiapplicationmain属性做了(在UIApplicationMain),出现在文件的顶部。(使用uiapplicationmain属性相当于调用uiapplicationmain函数和传递你的AppDelegate类的名字为代表的类的名称。作为响应,系统创建一个应用程序对象。应用程序对象负责管理应用程序的生命周期。该系统还将为您的AppDelegate类的一个实例,并将其分配到应用程序对象。最后,系统启动应用程序。)


AppDelegate类自动创建当您创建一个新项目。除非你正在做的事情很不寻常的,你应该使用这个类提供的Xcode初始化你的APP和响应应用程序级别的事件。AppDelegate类采用uiapplicationdelegate协议。该协议定义了一些用于设置应用程序的方法,以响应应用程序的状态更改,以及处理其他应用程序级别的事件。

AppDelegate 类包含单独一个属性: window. 

        var  window:  UIWindow?

此属性存储对应用程序窗口的引用。此窗口表示应用程序视图层次结构的根。它是所有应用程序内容绘制的地方。注意,窗口属性是可选的,这意味着它在某个点上可能没有值(nil)。

AppDelegate类还包含下列委托方法 methods的实现: 

funcapplication(_application:UIApplication,didFinishLaunchingWithOptionslaunchOptions: [UIApplicationLaunchOptionsKey:Any]?) ->Bool

funcapplicationWillResignActive(_application:UIApplication)

funcapplicationDidEnterBackground(_application:UIApplication)

funcapplicationWillEnterForeground(_application:UIApplication)

funcapplicationDidBecomeActive(_application:UIApplication)

funcapplicationWillTerminate(_application:UIApplication)

这些方法让应用程序对象与应用程序代表通信。在应用程序状态转换过程中,例如,应用程序启动,转换到后台,以及应用程序终止,应用程序对象调用相应的委托方法,给应用程序一个响应的机会。您不需要做任何特殊的事情,以确保在应用程序对象为您处理该作业的正确时间调用这些方法。

每个委托方法都具有默认行为。如果从您的AppDelegate类离开模板实现空或删除它,您可以将自己的代码添加到类方法中,定义在调用方法时执行的自定义行为。

模板还为每个类方法提供注释。这些注释描述了这些方法如何被应用程序使用。您可以使用存根方法和注释作为设计许多常见应用程序级行为的蓝图。

在本课中,你不会使用任何自定义应用程序委托的代码,所以你不必为appdelegate.swift文件做任何更改。


The View Controller Source File 视图控制器源文件

单视图应用程序模板的另一个源代码文件:ViewController.swift。选择viewcontroller.swift在项目浏览器中查看:


这个文件定义了一个名叫ViewController的自定义类的处理。现在,这类只继承了所有的行为定义的UIViewController。覆盖或延伸的行为,你可以重写定义在UIViewController的方法。

正如你可以看到在viewcontroller.swift文件,模板的实现重写的viewdidload()和didreceivememorywarning()方法;然而,模板的类方法实现不做任何事情,除了调用这些方法的UIViewController。您可以添加自己的代码来定制视图控制器对这些事件的响应。

虽然模板自带的didreceivememorywarning()方法,如果你不需要,可以删除它。

此刻,你的viewcontroller.swift代码应该是这个样子:

importUIKit

classViewController:UIViewController{

overridefuncviewDidLoad() {

super.viewDidLoad()

// Do any additional setup after loading the view, typically from a nib.

    }

}

您将在本课后面的源代码文件中开始编写代码。


Open Your Storyboard 打开你的故事板

        你可以开始为你的App使用故事板工作了。这是一个直观的应用程序的用户界面,显示屏幕的内容以及它们之间的转换。你用故事板奠定了流动或故事驱动程序。在构建的过程中,您清晰地看到了正在构建的内容,立即得到关于什么是工作和什么不是什么的反馈,并立即对用户界面进行可见的更改。

去打开你的故事板

        *在项目导航里,选择main.storyboard。(用 Interface Builder在Xcode里打开故事板-一个可视化编辑器-在编辑区域。这个故事板的背景是画布。您可以使用画布添加和排列用户界面元素。)



        此刻,在你的App里的故事板上包含一个场景,这是在你的应用程序的屏幕内容。在画布上的场景的左侧有个箭头,它是故事的切入点,这意味着,这一幕是应用程序启动时会首先加载。此场景包含由视图控制器管理的单个视图。您将更快地了解视图和视图控制器的作用。

当你在iPhone 7模拟器应用程序中运行你的应用程序时,这个场景中的视图就是你在设备屏幕上看到的。然而,画布上的场景可能与模拟器的屏幕的尺寸不相同。您可以在画布底部选择屏幕大小和方向。在这种情况下,它被设置为iPhone 7的肖像方向,所以画布和模拟器是相同的。

尽管画布显示了特定的设备和方向,但重要的是要创建一个自适应接口,一个自动调整的接口,使它看起来在任何设备和任何方向上都很好。当你开发你的界面时,你可以改变画布的视图,让你看到你的界面如何适应不同尺寸的屏幕。


Build the Basic UI(构建基本UI)

        现在是构建基本界面接口的时候了。你将开始工作在让你添加一个新的饭餐的一个用户界面的场景跟踪应用程序:FoodTracker。

Xcode提供了一个对象库,您可以添加到故事板文件。其中一些是出现在用户界面中的元素,如按钮和文本字段。其他,如视图控制器和手势识别,定义你的应用程序的行为,但不出现在屏幕上。

出现在用户界面中的元素称为视图(view)。视图向用户显示内容。它们是构建用户界面并以清晰、优雅和有用的方式呈现内容的基石。视图有很多有用的内置行为,包括屏幕显示和对用户输入的响应。

在iOS中所有的视图对象的类型基本都是UIView或它的一个子类。许多UIView子类有高度专业化的外观和行为。首先添加一个文本字段(UITextField),一个UIView子类,到你的场景里。文本字段允许用户输入一行文本,您将使用该文本作为用餐名称。


在场景中添加文本字段

1. Choose Editor > Canvas, 并确保显示边界矩形被选中。(此设置使界面生成器在画布周围的所有视图中绘制蓝色边框。许多视图和控件具有透明的背景,因此很难看到它们的实际大小。系统视图调整时引起的布局错误时,你可以预期更改的大小。启用此设置可以帮助您准确地了解视图层次结构中正在发生的事情。)

2. 打开对象库。(对象库位于Xcode编辑区的右侧底部。如果您没有看到对象库,请单击它的按钮,它是库选择器栏中左边的第三个按钮。或者,选择 View > Utilities > Show Object Library.)


显示每个对象的名称、描述和可视化表示的列表。

3. 在对象库中,在筛选器字段中键入文本字段,以便快速找到文本字段对象。

4. 将文本字段对象从对象库拖到您的场景中。


如果需要,可在这里放大缩小 Editor > Canvas > Zoom.

5. 拖动文本字段,使其位于场景的上半部分,并与场景中的左边缘对齐。当文本字段向左对齐时停止拖动文本字段。


蓝色布局指南帮助您放置文本字段。只有当拖动或调整对象旁边的对象时,布局指南才可见;当您放开文本字段时,它们就会消失。

6. 如果需要,单击文本字段以显示调整大小。(通过拖动它的大小调整来调整用户界面元素的大小,这是在元素边框上出现的小的白色方块。通过选择元素来显示元素的大小调整。在这种情况下,文本字段应该已经被选中,因为您刚刚停止拖动它。如果您的文本字段看起来像下面的文本字段,您可以调整它的大小;如果没有,请在画布上选择它。)


7. 调整文本字段的左、右边缘,直到看到三个垂直布局指南:左边距对齐、水平居中对齐和右对齐。


尽管您的场景中有文本字段,但没有向用户说明在该字段中输入什么字段。使用文本字段的占位符文本提示用户输入新餐的名称。


配置文本字段的占位符文本

1. 选择文本字段后,在工具区域打开属性检查器。(当您在检查器选择器条的左边单击第四按钮时,就会出现“属性检查器”。它可以让你编辑你的脚本对象的属性)



2. 在属性检查器中,找到标有占位符的字段,键入输入: Enter meal name。

3. 按回车显示文本字段中的新占位符文本。


在编辑文本字段的属性时,还可以编辑用户选择文本字段时显示的系统键盘的属性。

去配置文本字段的键盘

1. 确保文本字段仍然被选中。

2. 在属性检查器中,找到标记为返回键的字段并选择完成(必要时向下滚动)。此更改将使键盘上的默认返回键对用户更为显著,将其更改为一个已完成的键。

3. 在属性检查器中,选择“自动启用返回键”复选框(必要时再次向下滚动)。此更改使用户在输入文本进入文本字段之前无法打开已完成的键,以确保用户永远不能输入空字符串作为用餐名称。


         下一步,添加一个标签(UILabel)在画面上方。标签不是交互式的,它只是在用户界面中显示静态文本。为了帮助您了解如何定义用户界面中元素之间的交互,您将配置此标签以显示用户进入文本字段的文本。这将是测试文本字段是否接受用户输入并适当处理的好方法。  

在场景中添加标签

1. 在对象库中,在筛选器字段中键入标签以快速找到标签对象。

2. 从对象库中 拖动label 对象到场景中。

3.拖动标签,使其位于文本字段的上方,并与场景中的左侧边距对齐。停止拖动标签时,让它符合准则。



4. 双击Label键入 Meal Name.

5. 按回车显示标签中的新文本。



现在,添加一个按钮(UIButton)到场景。按钮是交互式的,因此用户可以点击它来触发您定义的操作。稍后,您将创建一个操作来将标签文本重置为默认值。

在场景中添加一个按钮

1. 在对象库中,在筛选器字段中键入按钮以快速找到按钮对象。

2. 从对象库中拖动按钮控件到你的场景中。

3. 拖动按钮,使其位于文本字段的下方,并与场景中的左侧边距对齐。停止拖动按钮时,让它扣符合准则。


4. 双击按钮然后键入:  Set Default Label Text.

5. 按回车键显示按钮中的新文本。

6. 如果必要可重新定位按钮。




        这是很好的方法去了解您添加的元素实际上是如何安排在场景中的。查看大纲视图,看看哪些用户界面元素已添加到您的场景中。

查看大纲视图

1. 在你的故事板,发现outline view toggle。


2. 如果大纲视图已折叠,请单击“切换”展开大纲视图。您可以使用大纲视图切换来折叠并展开所需的大纲视图。

大纲视图,它出现在画布的左边,提供您的脚本对象的分层表示。您应该能够看到刚才添加在层次结构中的文本字段、标签和按钮。但是为什么您添加的用户界面元素嵌套在视图下呢?

视图不仅显示在屏幕上,而且对用户输入作出反应,它们可以作为其他视图的容器。视图被安排在称为视图层次结构的层次结构中。视图层次结构定义视图相对于其他视图的布局。在这个层次,封闭在一个视图的视图称为子视图的父视图,包括一个称为它的父视图的视图。一个视图可以有多个视图的子视图只有一个。



一般来说,每个场景都有自己的视图层次结构。在每个视图层次结构的顶部是一个内容视图。在当前场景中,内容视图被命名为视图,视图控制器中的顶层视图。文本框、标签、按钮的内容视图的子视图。你在这个场景中,将此内容视图的子视图的所有其他视图(尽管他们自己可以有嵌套的子视图)。


Preview Your Interface 预览你的界面

定期预览你的应用程序,检查所有的东西都像你期望的样子。您可以使用辅助编辑器预览应用程序界面,它将与主编辑器并排显示一个辅助编辑器。

预览界面

1. 点击右上角附近的Xcode工具栏按钮打开助理编辑助理。


2. 如果你想要更多的工作空间,点击在Xcode工具栏的项目导航按钮和实用面板按钮,让它们折叠起来。


还可以折叠大纲视图。

3. 在编辑器选择器栏中,它出现在助理编辑器的顶部,切换助理编辑器,或者选择Preview > Main.storyboard (Preview).



正如您在助理编辑器中看到的,预览看起来几乎与画布完全相同。然而,这并不能真正告诉你任何新的东西。画布和预览都显示相同大小的屏幕(iPhone 7)和相同的方向(肖像)。如果你想检查你的界面是否是自适应的,你需要预览不同大小的屏幕和不同的方向。


4. 若要预览横的方向,请单击预览底部的“旋转”按钮。


不幸的是,事情看起来不再正确了。文本字段、标签和按钮与屏幕左上角保持相同的大小和位置。这意味着文本字段不再将屏幕从页边空白处填充到页边空白处。


5. 若要预览不同的屏幕大小,请单击辅助编辑器底部的Add按钮,然后选择iPhone SE。


text field, label, and button再一次保持在相同的尺寸和位置上,并保持在屏幕的左上角. 但是,这一次,文本字段超过了屏幕右边缘。


要创建一个自适应界面,您需要指定界面如何调整到不同的屏幕大小。例如,当界面被旋转到一个方向时,文本字段应该增长。当界面显示在iPhone SE上时,文本字段应该缩小。您可以使用自动布局来轻松地指定这些接口规则。


Adopt Auto Layout  采用自动布局

自动布局是一个强大的布局引擎,它帮助您设计自适应布局,动态响应对场景大小的任何更改。使用约束规则描述您的布局,该规则解释了一个元素应该相对于另一个元素的位置,或元素应该是多大的位置。自动布局根据这些约束动态计算每个元素的大小和位置。

一个最简单的定义你的布局方式是利用栈的观点(uistackview)。堆栈视图提供了一个精简的接口,用于在列或行中排列视图集合。堆栈视图在引擎盖下使用自动布局来计算它管理的所有视图的大小和位置。这使您可以轻松地访问自动布局的全部功能,同时大大减少了布局的复杂性。

采用自动布局,将现有的接口元素封装到堆栈视图中,然后添加在场景中放置堆栈视图所需的约束。


在用餐场景中添加自动布局约束

1. 单击标准按钮返回标准编辑器。


拓展项目导航和实用面板通过点击在Xcode工具栏上的导航和公用按钮。

2. 在按下键盘上的shift键时,选择文本字段、标签和按钮。


3. 在画布的右下方,单击“嵌入堆栈”按钮。(或者,选择 Editor > Embed In > Stack View.)


Xcode包装用户界面元素在堆栈,堆放在一起。Xcode分析你现有的布局图,项目应堆叠垂直、水平。



4. 如有必要,打开大纲视图。选择堆栈视图对象。


5. 在属性检查器中,在间隔字段中键入8。按返回。您会发现用户界面元素垂直地向外移动,堆栈视图随之增长。



6. 在画布的右下方,打开添加新的约束菜单。



7. 在“间距到最近的邻居”上方,单击两个水平约束和顶部垂直约束选择它们。他们被选中时变红了。


这些约束表示到最近的领先、拖尾和顶级邻居的间距。在这样的背景下,这个词最近邻方法最接近的用户界面元素的边界,可视图,另一个用户界面元素,或缘。因为“约束边缘”复选框被选中,在这种情况下,堆栈视图将被约束到父视图的左、右缘。这提供了堆栈视图和场景边缘之间的空间。

另一方面,堆栈顶部相对于场景顶部布局指南受到限制。如果状态栏可见,则顶部布局指南位于状态栏的底部。如果不是,它位于场景的顶部。因此,您需要在堆栈视图和布局指南之间添加一点空间。

8. 在左、右框中键入0,并在顶部框中键入20的间距。

9. 在更新框架旁边的弹出菜单中,选择新的约束项。这将使界面生成器在创建约束时自动更新受影响视图的框架。


10. 在“添加新约束”菜单中,单击添加3个约束按钮。

label, text field, and button 已被左对齐并以适当的间距布置, 但是text field 仍然没有拉伸来填充屏幕的宽度。要解决这个问题,您需要添加一个附加约束。


调整堆栈中的文本字段宽度

1. 在你的故事板里, 选择在菜单场景里的 text field .

2. 在画布的右下方,再次打开“添加新约束”菜单。

3. 在“间距到最近的邻居”上方,单击右水平约束选择它。它被选中时变成红色。

4. 在右边框中键入0。

5. 在更新框架旁边的弹出菜单中,选择新的约束项。

6. 在“添加新约束”菜单中,单击添加1个约束按钮。

检查点:在IOS模拟器里运行您的应用程序。旋转模拟器: choosing Hardware > Rotate Left and Hardware > Rotate Right (or Command-Left Arrow and Command-Right Arrow). 注意文本字段如何根据设备的方向和屏幕大小增长和缩小到合适的大小。还要注意状态栏在景观方向上是否消失了。

单击文本字段内,并使用屏幕键盘输入文本。(如果你愿意, 你也可以用电脑上的键盘 :选择 Hardware > Keyboard > Connect Hardware Keyboard).



Debugging Auto layout 调试自动布局

如果您没有得到预期的效果,请使用自动布局调试功能来帮助您。可以使用“更新帧”按钮访问这些功能,并解决“自动布局”问题菜单。

如果您收到关于错位视图的警告,请使用“更新帧”按钮。这个按钮更新选定的视图的框架和它的所有子视图。选择场景的视图控制器来更新场景中的所有视图。您还可以选择单击“更新帧”按钮仅更新所选视图。

如果布局不符合您的预期,请单击“解析自动布局”按钮以调出调试命令菜单。此菜单中的所有命令都有两种形式。一个影响当前选定的视图。另一个影响当前视图控制器中的所有视图。如果所有的命令是灰色的,选择场景的视图控制器或一种观点再次打开菜单。

选择“重置”建议的约束有Xcode与有效制约集更新你的界面。选择明确的约束来删除用户界面元素上的所有约束,然后尝试按照前面的说明再次设置约束。



Wrapping Up 总结

在本课中,你已经熟悉了一个Xcode项目的内容,并与许多用于运行iOS应用程序设计工具。您还构建了一个简单的用户界面。

虽然该项目的场景还没有做太多,但基本的用户界面在那里,功能齐全。确保你的布局从一开始就是可靠的和可扩展的,这样你就有了坚实的基础。


                注:这里提供完成本课中项目的样本下载文件,可以在Xcode查看它。

                       Download File

        PS:没想到翻译本文用了将近两天的时间。近9000的文字量,图片无数,本来打算放弃不翻译了,因为对于熟悉Xcode人来说,本课程只需要几分钟就搞定了。我也不知道是什么力量吸引我把它翻译完成,也许就是一种好奇,想看看到底iOS开发的根是什么样子的仅此而已。后续的翻译要看我的时间安排了,有空我就会翻译,希望得到大家的交流,谢谢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 原文链接:https://github.com/opendigg/awesome-github-android-u...
    IM魂影阅读 32,901评论 6 472
  • 一大早就收到了配送中心突然停电的消息,打电话问房东,房东说没收到通知,不知几点来电。这已经是第二次了,其实我心里怀...
    小戴的烧烤生活阅读 641评论 0 51
  • 今天特意看了电影《完美陌生人》,电影里有一句台词很重要:“人与人之间的关系是脆弱的。”经不起考验和猜疑。 在时间上...
    鹰飞飞阅读 172评论 0 0