『FoodTracker』(一)
实际上这是在学习一个XCode上的一个教程,这个教程演示了做一个名为『FoodTracker』的Dome。
语言版本:Swift2.0
XCode版本:7.3
Here We Go!
把 UI 稍微做一下
在 StoryBoard 拖几个组件进去:一个Label
、一个TextField
、以及一个Button
。这就是暂时需要的所有东西,设置好约束,让它们竖着排成一列就好,样式什么的,暂时随便设置一下就行了,这里让我比较疑惑的是:教程中把这三个组件都放到了 StackView
里去了,这个东西我还从来没有用过,不过暂时也不会造成什么影响,先继续看下去。
先实现个小功能
在Storyboard 里,先把Label
和 TextField
组件使用 Control-drag 大法拉到 ViewController.swift
文件中,分别设置变量名为:mealNameLabel 和 nameTextField。这时候他们的标记是@IBOutlet
。
再把button
也Control-drag过来,取函数名为setDefaultLabelText
,不同的是这个的connection
要选 action
,并将type设置为UIButton
,它的标记是@IBAction
。
(『IB』是『Interface Builder』的缩写哦。)
Button
按钮既然链接的是个 Action,那么肯定是要做点什么的嘛,在这里我们写一个方法,作用是让使用者点击这个Button
后,把 在Label
组件里显示的内容设置为一个我们想要的东西,在这里我们就设置为这样的一个字符串好了:"Cheri is good"。写起来也很容易,像下面这样:
@IBAction func setDefaultLabelText(sender: UIButton) {
mealNameLabel.text = "Cheri is good"
}
还记得我们给Label
组件起名为mealNameLabel
吧,只需要把我们想设置的字符串赋予mealNameLabel.text
就行啦。
使用代理
接下来我们要做的事情是这样的:在TextField
中输入一些东西,然后让Label
组件显示我们输入的东西。
为了完成这个需求,我们需要用到代理(delegate)。
ViewController.swift
文件中有一部分自动生成的代码:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
我们需要在super.viewDidLoad()
这一句的下面加上我们对代理的使用:
nameTextField.delegate = self
使用这行代码,我们就能通过对delegate的调用来处理 TextField
组件的内容。
首先我们需要在override func vieDidLoad(){}
方法后面加上两个方法,像这样:
override func viewDidLoad() { super.viewDidLoad()
//通过 dalagate 的回调,处理 TextField 输入的内容
nameTextField.delegate = self
}
// MARK: UITextFieldDelegation
func textFieldShouldReturn(textField:UITextField) -> Bool {
}
func textFieldDidEndEditing(textField:UITextField) {
}
其中TextFieldShouldReturn
方法需要对textField
使用resignFirstResponder()
以取消其第一反馈者的身份。
而textFieldDidEndEditing
方法则是将用户在textField
组件中输入的内容传递给Label
组件。
实现后,看上去是这样的:
// MARK: UITextFieldDelegation
func textFieldShouldReturn(textField:UITextField) -> Bool {
//Hide the keyboard
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(textField:UITextField) {
mealNameLabel.text = textField.text
}
这样一来,第一个小功能就实现了:在TextField
中输入内容,按回车后,输入的内容会显示在Label 中
,点击button
后会把Label
中的内容设置为默认值(cheri is good)。
千万不要忘记了给代码最开始的class ViewController
后面加上一个UITextFieldDelegate
类型像这样:
class ViewController: UIViewController, UITextFieldDelegate {}
全部代码如下:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var mealNameLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//通过 dalagate 的回调,处理 TextField 输入的内容
nameTextField.delegate = self
}
// MARK: UITextFieldDelegation
func textFieldShouldReturn(textField:UITextField) -> Bool {
//Hide the keyboard
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(textField:UITextField) {
mealNameLabel.text = textField.text
}
// MARK: Actions
@IBAction func setDefaultLabelText(sender: UIButton) {
mealNameLabel.text = "Cheri is good"
}
}
这个程序可以从这个链接下载到