Connections
连接UI和View Controller
- Storyboard中其实是xml文件,但不要直接修改xml文件
还是使用crtl
+ 拖动的方式
-
Outlets: 获取或者修改组件的properties时,使用outlets
- outlet
- outlet collection
- IBOutlet: Interface Builder
- 声名的变量
textField
是implicitly unwrapped optional - weak/strong: outlets都是weak references, 不需要我们手动初始化对象
-
Actions: 希望组件对用户输入做出反应,使用actions
- Type
Any
: 任何data type
- events: 用户可能与UI交互的行为
- sender:执行函数的对象,可以在函数内部access
- Type
Text Field
- keyboard traits 中可以customize弹出键盘的形式,例如keyboard type中可以选择用户输入的形式
- simulator有时候会不受控制,可以通过
cmd+k
弹出或消失
@IBAction func buttonDidPressed(_ sender: UIButton){
let name: String = nameTextField.text
//不能build,因为左边是string,右边是optional
//Correct way:
let name: String = nameTextField.text ?? ""
//通过nil-coalescing提供一个默认值
}
使键盘消失
- 用户通常会用
enter
或者点击空白处来撤销键盘 - enter取消键盘,两种常用方式(二选一)
UITextFieldDelegate protocol
IBAction
- 注意event是
Did End On Exit
在viewDidLoad中加入下面的代码,使初始时屏幕的focus为textField
override func viewDidLoad() {
super.viewDidLoad()
textField.becomeFirstResponder()
}
在用户点击别处或enter时,
@IBAction func userDidTappedReturn(_ sender: UITextField) {
textField.resignFirstResponder()
}
- 在有多个输入的情况,比如email+密码,可以在enter时把firstResponder变成下一个输入textView
点击背景处使键盘消失
- 两种常用方法,二选一
- Background Button,把背景变成一个巨大的透明按钮
- Touch events
Background Button
- 添加一个按钮,边界设为屏幕边缘
- 在document outline中把它拖到最上面 - 成为最靠后的element(最先render,所以在最后面)
- 为Background Button添加action:点击时取消textField的firstResponder
Touch Events
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?){
let touch = touches.first
if nameTF.isFirstResponder && touch?.view != nameTF {
nameTF.resignFirstResponder()
}
super.touchesBegan(touches, with: event)
}
常见错误
- 在ViewController中重命名一个组件,报错
this class is not key value coding-compliant for the key ...
⇒ storyboard中的reference也需要重命名 - 可以使用右键+rename的方式,需要先删除掉已经建立的connection