Start Developing iOS Apps (Swift)->构建基础UI(一)

本课会让你熟悉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的课程中,你将会在这个源代码文件里写代码。

(未完待续......)

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,029评论 4 62
  • 薛卿瑶这个月来第三次了。 我想她大概是实在找不到可以话唠的人,就选我作为唠嗑对象。 所以她能想出来的占卜问题,一次...
    穆也阅读 202评论 0 0
  • 每一个不曾起舞的日子,都是对生命的辜负! 第二天90天(2017-8-10月) 目标一:备考雅思6.5 目标二:朝...
    AMY3358阅读 170评论 0 0
  • 程序结构 go语言标识符区分大小写 关键字:共25个 一些go内建的常量,变量,函数 Go语言通过标识符首字母大小...
    刀刀天涯阅读 226评论 0 0