文章鏈接
UITextField本身自帶三個(gè)消息類型:
UITextFieldTextDidBeginEditingNotification
UITextFieldTextDidChangeNotification
UITextFieldTextDidEndEditingNotification
至于作用嘛,看名字就知道了啦~~
因?yàn)榈卿浗缑嫘枰蹇荆越裉炀蜕晕⒌牧私饬艘幌? =绑警,然后怕又會(huì)忘記了蹋嵌,所以就記錄下來(lái)了。
接下來(lái)講講怎么使用這三個(gè)東西。
首先,我想實(shí)現(xiàn)一個(gè)這樣的功能末购,就是以下(還在很后面呢)的登錄界面,登錄按鈕在用戶名或者密碼為空的時(shí)候是無(wú)法點(diǎn)擊的虎谢,當(dāng)用戶名和密碼都不是空的時(shí)候盟榴,登錄按鈕才可以點(diǎn)擊。而且最重要的是這個(gè)過(guò)程是動(dòng)態(tài)的婴噩,不能等用戶名或密碼輸完了后在判斷擎场,于是代理方法里的textFieldDidEndEditing就帕斯掉了,那么不還有一個(gè)shouldChangeCharactersInRange方法嗎讳推?這家伙不也是可以實(shí)時(shí)監(jiān)控輸入內(nèi)容的嗎顶籽?非得用nsnotification?嗯银觅,你可以自己嘗試下。坏为。究驴。。匀伏。
于是我就用UITextFieldTextDidChangeNotification來(lái)實(shí)現(xiàn)我的功能啦洒忧,如名所說(shuō),只要文本框發(fā)生變化就會(huì)觸發(fā)消息够颠。
首先添加觀察者, 記得不用的時(shí)候要解除掉通知哦熙侍。:
//ViewContrller.swift
override func viewDidLoad() {
super.viewDidLoad()
......
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.loginStatus(_:)), name: UITextFieldTextDidChangeNotification, object: nil)
// Do any additional setup after loading the view.
}
override func viewDidDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self, name: UITextFieldTextDidChangeNotification, object: nil)
}
實(shí)現(xiàn)loginStatus方法。搞定履磨。
//ViewContrller.swift
func loginStatus(sender: NSNotification) {
//sender.object!.isEqual(self.userText)
//sender.object!.isEqual(self.pwdText)
if (!self.userText.text!.isEmpty && !self.pwdText.text!.isEmpty) {
self.btn_Login.enabled = true
} else {
self.btn_Login.enabled = false
}
}
以下是該方法的原型
func addObserver(observer: AnyObject, selector aSelector: Selector, name aName: String?, object anObject: AnyObject?)
讓本菜鳥稍稍作下解釋:
observer: 觀察者蛉抓,嗯。
selector: 選擇器, 嗯剃诅。
name: 消息名巷送,嗯。
object: 對(duì)象, 嗯矛辕。(哎呀笑跛,千萬(wàn)不要扔石頭= =,很通俗易懂的解釋有木有)
這里的object指的是發(fā)送消息的對(duì)象聊品,如果是nil的話飞蹂,如我上面所寫的,那么所有的UITextField對(duì)象都可以發(fā)送消息翻屈,也就是我的userText和pwdText啦陈哑,如果指明對(duì)象的話,那么只有注冊(cè)的對(duì)象才能發(fā)哦。如下,self.pwdText將不會(huì)發(fā)送消息芥颈,因?yàn)闆](méi)有注冊(cè)嘛惠勒!還有當(dāng)多個(gè)對(duì)象共用同一個(gè)選擇器時(shí),可以通過(guò)sender.object!.isEqual()判斷是哪個(gè)對(duì)象哦爬坑。
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.loginStatus(_:)), name: UITextFieldTextDidChangeNotification, object: self.userText)
通過(guò)上面的倆照片纠屋, 細(xì)心的同學(xué)可能發(fā)現(xiàn)了,當(dāng)我編輯文本框時(shí)文本框下面的線顏色變了耶盾计,很炫酷有木有(好吧售担,我知道其實(shí)很菜= =)
其實(shí)這個(gè)功能是完全可以用代理方法實(shí)現(xiàn)的,即
textFieldDidEndEditing
textFieldDidBeginEditing
但是呢署辉,很不巧族铆,上面?zhèn)zUITextFiled是我自定義的。哭尝。哥攘。bottom線當(dāng)然也屬于自定義的一部分啦,我可不想每次新創(chuàng)建一個(gè)UITextField對(duì)象都要去設(shè)置一下代理方法材鹦。又有同學(xué)說(shuō)了逝淹,那你不會(huì)讓你自定義的UITextField自己去實(shí)現(xiàn)代理方法啊,這個(gè)方法好像也可行桶唐,但是又很不湊巧栅葡,我的ViewController也要實(shí)現(xiàn)它們的代理方法。尤泽。欣簇。。(坯约!@#¥熊咽!@¥)
于是呢,就有了下面一大串實(shí)現(xiàn)這個(gè)功能的代碼了鬼店。嗯网棍,點(diǎn)點(diǎn)點(diǎn)是其它被省略的代碼。
class TSUITextField: UITextField {
........
........
override init(frame: CGRect) {
super.init(frame: frame)
.....
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.changeBottomLineColor), name: UITextFieldTextDidBeginEditingNotification, object: self)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.changeBottomLineColor), name: UITextFieldTextDidEndEditingNotification, object: self)
.....
}
......
func changeBottomLineColor() {
if self.editing {
self.bottomLine.backgroundColor = self.bottomLineColorOfSelected
} else {
self.bottomLine.backgroundColor = self.bottomLineColorOfNormal
}
}
func setBottomLineColor(color: UIColor, state: UIControlState){
switch state {
case UIControlState.Normal:
self.bottomLineColorOfNormal = color
case UIControlState.Selected:
self.bottomLineColorOfSelected = color
default:
break
}
}
......
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self, name: UITextFieldTextDidBeginEditingNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UITextFieldTextDidEndEditingNotification, object: nil)
}
}
上面的代碼其實(shí)就做了這么幾件事妇智。
- 對(duì)自己注冊(cè)了UITextFieldTextDidBeginEditingNotification和UITextFieldTextDidEndEditingNotification消息,也可以理解為自己獲得焦點(diǎn)時(shí)發(fā)送消息滥玷,失去焦點(diǎn)時(shí)又發(fā)送一次消息。
- 實(shí)現(xiàn)處理方法changeBottomLineColor()巍棱。這里面用到了UITextField的可讀屬性editing,當(dāng)失去焦點(diǎn)時(shí)editing為false,獲得焦點(diǎn)時(shí)為true,通過(guò)它就可以自由更換顏色了惑畴。