IOS Apps 开发(Swift)(4)——Connect the UI to Code(2)

来源:互联网 发布:阿里导出淘宝数据包 编辑:程序博客网 时间:2024/06/04 20:12

前言:网上一直没有找到用Swift开发IOS的好的教程,所以找了官网的文档翻译一下算了。如有错误欢迎指正。博主首发CSDN,mcf171专栏。

博客链接:mcf171的博客

原文链接:Connect the UI to Code

——————————————————————————————

在上一个小节中我们完成了一个里程碑。上面就是iOS app 设计中的面向动作的设计模式。面向动作的设计也就是当某一个特等事件发生的时候一个对象像另外一个对象发送消息。在我们这个案例中,事件是用户点击了Set Default Label Text 按钮,动作是setDefaultLabelText,目标是ViewController(因为在类中定义了方法),这个发送人是Set Defaut Label Text按钮。消息是我们在代码中定义的动作方法。因此目标是能接受消息的对象,同时也能执行动作。能发送动作消息的对象比如说按钮是可以出发事件从而响应用户的交互比如说点击、拖拽。这种模式在iOS app程序开发中是相当常见的,在剩下的课程中我们能看到更多的例子。

处理用户输入

在这个时候我们可以修改标签的值了,现在呢我们的目标是增加一个行为来设置标签的值为我们在文本框输入的值。为了简单化,我们定义用户在文本框按下回车键的时候则表明标签应该要更新了。

(下述这段楼主没太懂)

当我们从文本框接受用户输入的时候,我们需要从文本框的代理获取一些帮助。代理是一个对象行为的代表,也可以和其他对象进行协同。在我们这个例子中这个文本框的代理对象有这对其他对象的引用。在合适的时候这个代理对象将发送消息给另一个代理。这个消息将告诉代理,代理对象正要处理或者刚刚处理完。


当文本被编辑时,一个文本框代理和文本框进行交流。并且当重要的事件发生时代理也能了解,比如说什么时候一个用户开始编辑或者停止编辑文本。这个代理使用这个消息在合适的时候来保存或者清理数据,忽略键盘等等。


只要一个对象遵循了合适的接口,这个对象就可以作为其他对象的代理。UITextFieldDelegate定义了了文本框的代理接口。在这个案例中,因为ViewController拥有对于文本框的引用,所以我们可以让ViewController作为文本框的代理。


首先我们需要让ViewController采用UITextFieldDelegate接口。只需要在类声明后面加上这个接口即可。

采用UITextFieldDelegate接口

1、如果助手编辑器是打开的,通过点击标准编辑器按钮来返回标准编辑器界面。同时可以点击导航纽克和实用工具区纽扣进行展开


2、在工程导航中,选取ViewController.swift。

3、在ViewController.swift中找到class所在的行。应该看起来是这样的

class ViewController: UIViewController {

4、在UIViewController后加一个逗号和UITextFieldDelegate来采用这个接口

class ViewController: UIViewController, UITextFieldDelegate {

通过采用了这个接口,那么ViewController类就可以将自己定义为UITextFieldDelegate。也就意味着我们可以将ViewController设置为文本框的代理并通过实现一系列的行为来处理文本框的用户输入。

设置ViewController作为nameTextField的代理

1、在ViewController.swift找到viewDidLoad()方法

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

这个模板的实现方法包括了一个注释。我们不需要这个注释所以可以直接删掉或者不管。

2、在super.viewDidLoad()方法下增加一个空行和下面的语句

// Handle the text field’s user input through delegate callbacks.nameTextField.delegate = self

self 指的就是ViewController类。

现在你的viewDidLoad()方法应该看起来是这样的()

override func viewDidLoad() {    super.viewDidLoad()        // Handle the text field’s user input through delegate callbacks.    nameTextField.delegate = self}

ViewController现在代理了nameTextField。

UITextFieldDelegate接口包含了optional方法,也就是没必要一定实现他们,但是对于一些我们想实现的一些行为,我们必须要实现其中的两个方法。

func textFieldShouldReturn(textField: UITextField) -> Boolfunc textFieldDidEndEditing(textField: UITextField)

为了理解这些方法什么时候调用,并且做了什么。因此非常重要的理解文本框如何对于用户事件进行响应。当用户点击文本框的时候,会制动称为第一响应者。在一个app中,第一响应者是一个第一个接受各种各样app时间的对象,包括关键事件、手势事件和动作消息。换句话来说,许多用户产生的事件都自动转给第一响应者。


当一个文本框称为第一响应者的时候,iOS会显示一个键盘并且开始编辑会话。用户在键盘中输入的都会插入到文本框中。


当一个用户想完成文本框的编辑时,文本框需要移除自己是第一响应者的状态。因为文本框不在是app上激活的对象,事件需要转发到更合适的对象上。


这个时候就要说到我们需要实现的UITextFieldDelegate方法。我们需要指定当用户点击按钮来结束文本框的编辑时,文本框需要移除自己是第一响应者的状态。我们通过textFieldShouldReturn()方法来做这个事情。

实现textFieldShouldReturn方法

1、在ViewController.swift在// MARK: Actions上添加下述

// MARK: UITextFieldDelegate


这个注释是用来组织代码和帮助你通过这个注释进行导航


我们已经增加了一些注视了,Xcode列表会将这些注释作为源代码文件中函数菜单的一个小节,当你点击编辑区域顶部的文件名的时候就可以看到。这个函数功能可以快速的帮助你快速的跳跃到相应的代码块。注意这个小节的命名规则是//MARK: 你可以通过点击其中的一个小节标题来跳跃到相应的小节。


2、在注释下添加以下方法

func textFieldShouldReturn(textField: UITextField) -> Bool {}

3、在这个方法中添加下述代码来移除文本框的第一响应者状态兵增加一个描述信息。

// Hide the keyboard.textField.resignFirstResponder()

当我们手动输入这两行代码的时候,我们会发现Xcode的代码提示功能是一个非常好的功能。当Xcode显示一系列可能完成的提示,我们可以滚动列表直到找到想要的从而按下回车。Xcode就会插入整行代码。

4、在方法的最后添加下述代码

return true
因为这个方法必须返回一个Boolean类型的值,所以返回true表明当用户按下回车键之后,文本框应该忽视键盘输入。


第二个需要实现的方法是textFieldDIdEndEditing,这个方法会在文本框移除了第一响应者状态之后被调用。也就是在textFieldShouldReturn方法之后被调用。


textFieldDidEditing方法给了我们机会来获取输入文本框的消息,然后进行处理。在我们的例子中,我们需要获取文本框的值然后用这个值来修改标签。

实现UITextFieldDelegate接口的textFieldDidEndEditing方法

1、在ViewController.swift文件中的textFieldShouldReturn方法后添加下述方法

func textFieldDidEndEditing(textField: UITextField) {}

2、在这个方法中添加以下代码

mealNameLabel.text = textField.text

最终textFieldDidEndEditing应该是以下形式

func textFieldDidEndEditing(textField: UITextField) {    mealNameLabel.text = textField.text}

里程碑:运行模拟器,我们选择文本框并且敲入一些文字。当我们点击键盘的Done按钮时,键盘会消失,标签文字会变为文本框的文字,当我们点击Set Default Label Text按钮时,标签会变为Default Text。





ps:这节课完整的实例工程为:Download File


0 0
原创粉丝点击