004 View Controller

作者: ErlichLiu | 来源:发表于2017-09-18 15:16 被阅读26次

上一节我们完成了如何添加一个按钮的流程,众多的用户界面控件也都是通过上一节的流程完成的。完成了这一步,我们就完成了「可视」这个部分,但是当你点击或者滑动这些控件的时候,它们并没有任何反应。那是因为他们还需要和代码进行绑定,通过写代码来设计一系列的交互操作。

所以这一节就开始接触真正的代码啦。

在 Bull‘s Eye 游戏里,我们有个流程是用户点击「Hit Me!」后会弹出一个提示框,然后在提示框里显式分数等一些信息,那我们就开始做吧,不过首先我们做一个简单点的,让弹出的提示框只显示「Hello Word !」就可以了。

在「Project Navigator」里选择「View Controller.swift」,这时 Interface Builder 就消失了,你会看到这幅画面,带有不同颜色成簇出现的鲜亮颜色的文本,这就是你 APP 的源码了。

接下来在最后一个花括号内添加一下代码

@IBAction func showAlert(){
}

现在你的 View Controller 看上去是这样的。

//
//  ViewController.swift
//  BullsEye
//
//  Created by Erlich on 2017/9/5.
//  Copyright © 2017年 ErlichLiu. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBAction func showAlert(){
        
    }
}
注意:

Xcode 是有自动保存功能的,无论是做任何修改,Xcode 都会记录下来,Xcode 也不尽然完美,偶尔也会有崩溃的时候,在崩溃的时候就不能正常的自动保存了,所以好习惯是在修改完成后习惯按下 Command + S。

View Controller


View Controller 就是用来编写源代码的地方,它通常会在开发中占用大部分时间。它的主要工作就是用来管理APP 中单个页面。

比如你想做一个简单的食谱目录,当你打开这个应用,主页面会列出已经提供的食谱,点击食谱会打开另一个页面来显式详细信息。那么这两个页面都是由各自的 View Controller 来控制的。

这两个页面显示的大有不同,一个是显示表单,另一个是显示的详细页面。这也就是为什么你需要两个 View Controller,因为一个要用来处理如何呈现表单,另一个用来处理如何呈现图片和文字介绍。IOS 设计原则之一是每个页面都要有自己的 View Controller。

当前 Bull's Eye 只有一个页面,所以目前我们也就只需要一个 View Controller。这个 View Controller 的名字也被简单的命名为「View Controller」,这样 storyboard 和 Swift 文件一起就可以实现应用的效果了。

Main.storyboard 的设计包含了 View Controller 的用户接口,而 ViewController.swift 中包含了它的功能实现。

实现链接

刚刚你添加的哪一行代码就是让 Interface Builder 知道ViewController.swift 中有 showAlert() 这个行为。现在你将把 Button 和行为链接起来。

  • 点击 Main.storyboard 回到 Interface Builder。在左侧会有一个面板叫 「Outline pane」,它会列出 storyboard 中的所有项目。如果你没有看到这个面板,请点击右下角这个小图标来切换状态,让「Outline pane」显式出来。
  • 点击一下「Hit Me!」按钮来选中它,然后按住 Control 键,点击「Hit Me!」并把它托拽到「Outline pane」中的 View Controller。这时候你会看到一条蓝线。(你也可以选中「Hit Me!」后,点击右键拖拽到 View Controller,之所以选做备选方法,是因为这种方法很容易改变按钮的位置和大小。)

  • 当你完成这个操作的时候,会出现一个小的菜单和鼠标。其中有一些选项,包括「Action Segue」和「Sent Event」还要其他的选项。你所关心的就是「Sent Event」下的 showAlert,这个跟你在 ViewController.swift 下添加的方法名称是一样的。

  • 点击showAlert选项,当你选中后,在选中项的前面会有一个小圆点来提醒你当前 Interface Builder 的按钮已经和 @IBAction func showAlert()建立了连接。现在你点击按钮就会执行 showAlert() 的方法了。这就是你如何用按钮来控制做某事的过程:在 Swift 文件中声明一个方法,然后在在 Interface Builder 中与这个方法关联起来。(你可以在 Utilities pane 的 connections inspector 中看到连接情况,它在Xcode 窗口的右边)

  • 点击面板上的小箭头图标切换到 connections inspector。

  • 在「Sent Event」栏中,「Touch Up Inside」已经连接到了 View Controller showAlert。你也可以在 Swift 文件中看到。

  • 选择 ViewController.swfit 来编辑,注意@IBAction func showAlert() 前面有个实心的小圆圈,点击小圆圈就知道当前这个方法连接的是什么。

为按钮做相应动作


你现在有一个带有一个按钮的页面,并且按钮和一个叫做showAlert 的方法相连接,当你点击按钮的时候就会执行这个方法的操作。

然而目前这个方法什么都没有做,所以你点击也不会有什么反应,所以我们需要来添加代码,让 APP 实现一定的功能。

  • 在 ViewController.swift 中的showAlert()中添加一下代码。
@IBAction func showAlert() {

let alert = UIAlertController(title: "Hello, World", message: "This is my first app!", preferredStyle: .alert)

let action = UIAlertAction(title: "Awesome", style: .default, handler: nil)

alert.addAction(action)

present(alert, animated: true, completion: nil)

}

这几行代码给showAlert()这个行为提供了真实的功能。在两个花括号内的代码在告诉 iPhone 应该要做什么,当执行这个方法的时候,代码会从上至下依次执行。在showAlert()中的这几行代码创造了一个提示框,显示一个叫「Hello World」的标题和「This is my first app!」的消息,还有一个写着「Awsome」的按钮。

其实标题和消息都是显式文字,但是标题要稍微大一点,并且使用的粗体。

  • 在 Xcode 的工具栏里点击 Run,如果你没有任何拼写错误,Xcode 将会打开模拟器,启动 APP 后点击按钮将会弹出一个提示框。

恭喜你!你已经完成了你的第一个APP。沉淀一下,回过头看一下我们的过程,当你准备好,我们要继续向前进行了。

遇到了问题?

如果当你点击 Run 的时候,Xcode 显示「Build Failed」的错误信息,首先确保你输出的代码完全正确。即便是很小的错误都可以导致错误。

典型的错误是不区分大小写,但是 Swift 语言是大小写敏感型语言。这也就意味着,当你看到Alert & alert是两个不同的含义。Xcode 会报<something> undeclared 或者Use of unresolved identifier错误。

当 Xcode 报Parse Issue 或者Expected <something>的错误时,可能是你在某个部分忘记了花括号}或者圆括号)。(Tips:当你将光标移动到一个闭合的花括号,Xcode 会高亮出另一个花括号的位置。)

小细节在编程中也极为重要,即便是一个简单的位置错误,都会阻止Swift 的编译器编译你的 APP。

幸运的是,这些错误在 Xcode 的提示下,你都能轻松地找到。

当 Xcode 监测到你的代码中出现错误,在 Xcode 的左侧的 「Issue navigator」中就会出现错误提示,这个表单就是在提示你 Xcode 已经发现的错误和警告。

很明显,在这个错误中我忘记了一个逗号,点击这个错误信息,Xcode 会带你到错误的地方,甚至会提示你如何去解决这个错误。

有时候你的程序编译失败会让你感到很疑惑,幸运的是,Xcode 会帮你侦探到错误的地方帮你解决问题。

错误和警告

Xcode 用不同的颜色来区分错误(红色)和警告(黄色), 一旦出现错误,Xcode 就会阻止你编译和运行当前这个 App。警告只是提供一些可能的信息,就是说 Xcode 提示你可能会有一些问题,但是你可以选择忽略这个。其实,有警告是很正常的,但是如果能解决警告可以尽量选择解决警告。

App 是怎样工作的?


现在是一个不错的机会,来了解一下 App 背后正在发生着什么事。

App 其实是由各种可以相互发送信息的objects(对象)组成的。有些对象是由 IOS 提供的,比如 Button 类型的 UIButton object ,弹出式提示框类型的 UIAlertController object。还有一些对象是要你自己编写的,比如 view controller。

这些对象间相互通信,当用户点击「Hit Me!」按钮的时候,那么 UIButton object 就会发送信息到你的 view controller。反过来,view controller 也会接受发送很多信息。

在 IOS 中,App 是事件驱动的的,这也就意味着,对象监听某个事件的变化,然后处理它。其实一个 App 大部分时间都是在等待,等待用户触摸屏幕,然年进行相应的处理。这一整个处理的过程也不过几毫秒,然后再次回到休眠状态,直到下一个事件发生。

整个过程就是用户点击「Hit Me」按钮后,UIKit 可以识别出这是一个触摸事件,然后根据按钮的绑定,发送信息到 showAlert 方法,showAlert 要想弹出提示框就要发送信息到 UIAlertController 对象并初始化这一操作,然后 UIAlertController 对象发送回执信息给 showAlert 方法,同样这个反馈的机制会从 showAlert 方法到触摸事件,最后交由到 UIKit 的手中。

也许你以前在网站上用过 PHP 或者 Ruby 的脚本,但是 IOS 的基于事件模型的工作方式和 PHP 或者 Ruby 都不尽相同。PHP 会从上倒下一条一条语句地执行,直到执行到最后然后退出。

在 App 中呢,只要用户不终止 App 或者 App 不崩溃掉,它是不会退出的。它们始终在休眠中等待用户输入事件,然后处理完毕继续休眠。

用户输入的事件最主要的就是触摸点击操作,当然还有其他类型的事件,比如当用户来电话的时候,操作系统会给出提示,当屏幕开始重绘,计时器计时完毕等等。

以上的种种都可能让你的 App 中触发事件。

用我们的方式来列出一个但办事项清单


现在你已经完成了第一个带有一个按钮的 App,并让它显式了一个提示框,那么你只需沿着列表完成并划掉下面的项目。

你不必一定按照这个这个顺序执行,但是有时候按照顺序做才是奏效的。比如在你没有一个滑动条的时候是不能读取滑动条的数据的。

所以来让我们完成剩下的控件——滑块和文本框,让这个 App 看上去更像是一个真实的游戏。

当你完成,这个 App 看上去就是这个样子。

这些采用的都是标准的 UIKit 的控件,是一种开箱即用的状态。所以先不要抱怨它们很丑,我保证后面你看到经过装饰会非常美观。

UIKit 和 其他框架
iOS 提供了很多框架和工具来创建界面,UIKit 提供给用户可视化控件,你比如说按钮,文本,导航条等。它通常管理 view controller 并处理用户界面的其他操作。
如果你从头开始写这些,那肯定够你忙的。相反的,你可以在系统框架上构建你的程序,并充分利用苹果工程师已经为你完成的工作。
任何你看到的以 UI 开头的名称都是来自 UIKit 比如
UIButton。当你开始编写 iOS 程序的时候,UIKit 将会伴随你大量时间。
还有其他的框架,比如 Foundation,为了构建程序,它提供了很多基本构建模块。Core Graphic 用来绘制像直线、斜线等基本图形。AVFoundation 是为了播放音频和视频而生,当然还有很多这样的。
iOS 整套框架统称为 Coca Touch。

这一节讲的已经够多了,回头回顾一下吧,下一节我们将讲在 Bull‘s Eye 游戏中会用到竖屏模式(Portiait)和 横屏模式(Landscpe)还有更多。

下一节

相关文章

网友评论

    本文标题:004 View Controller

    本文链接:https://www.haomeiwen.com/subject/skrbsxtx.html