利用NSNotificationCenter消息通信機(jī)制觀察UITextField的狀態(tài)(Swift)

文章鏈接
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í)就做了這么幾件事妇智。

  1. 對(duì)自己注冊(cè)了UITextFieldTextDidBeginEditingNotification和UITextFieldTextDidEndEditingNotification消息,也可以理解為自己獲得焦點(diǎn)時(shí)發(fā)送消息滥玷,失去焦點(diǎn)時(shí)又發(fā)送一次消息。
  2. 實(shí)現(xiàn)處理方法changeBottomLineColor()巍棱。這里面用到了UITextField的可讀屬性editing,當(dāng)失去焦點(diǎn)時(shí)editing為false,獲得焦點(diǎn)時(shí)為true,通過(guò)它就可以自由更換顏色了惑畴。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市航徙,隨后出現(xiàn)的幾起案子如贷,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠袱,死亡現(xiàn)場(chǎng)離奇詭異尚猿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)楣富,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門凿掂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纹蝴,你說(shuō)我怎么就攤上這事庄萎。” “怎么了塘安?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵糠涛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我兼犯,道長(zhǎng)忍捡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任切黔,我火速辦了婚禮锉罐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绕娘。我一直安慰自己,他們只是感情好栽连,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布险领。 她就那樣靜靜地躺著,像睡著了一般秒紧。 火紅的嫁衣襯著肌膚如雪绢陌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天熔恢,我揣著相機(jī)與錄音脐湾,去河邊找鬼。 笑死叙淌,一個(gè)胖子當(dāng)著我的面吹牛秤掌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹰霍,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼闻鉴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了茂洒?” 一聲冷哼從身側(cè)響起孟岛,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后渠羞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斤贰,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年次询,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荧恍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渗蟹,死狀恐怖块饺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雌芽,我是刑警寧澤授艰,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站世落,受9級(jí)特大地震影響淮腾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屉佳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一谷朝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧武花,春花似錦圆凰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至累铅,卻和暖如春跃须,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娃兽。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工菇民, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人投储。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓第练,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親轻要。 傳聞我的和親對(duì)象是個(gè)殘疾皇子复旬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容