當前位置:
首頁 > 最新 > RAC高級用法

RAC高級用法

在這邊先預告,前方高能,此篇過後將會愛上RAC 無法自拔,現在回頭還來得及,因為過了這扇們之後,你會發現自己已經忘了之前是怎麼處理事件了,沒有 RAC 不行了!

入此們者,放棄所有希望

先來創建一個項目,然後集成 RAC 的框架,首先我們再來說明一下,RAC 他可以幫我們簡單粗暴地處理事件,之前我們提到了,他可以代替代理,代替通知,代替KVO,監聽事件,監聽文本匡。

之前我們已經提過了代替代理了~

接下來我們來看看其他的,首先來到我們的 storyborad 跟之前一樣我們放上一個 UIView 然後再來跟個 button

之後一樣的創建一個叫做 redView 然後他繼承 UIView

別忘了把 storyBoard 上面的 紅色 view 綁定我們的 review

接下來我們要來到這個 redview 裡面來綁定我們的 button 的點擊方法

然後把 view 托給控制器

之前我們是不是講過,當我點擊按鈕的時候我在這裡面通知外面的控制器,之前我門用過 RACSubject

現在我們正式來實現了!

首先我們使用這個方法 rac_signalForSelector ,他創建了一個信號給 selector

簡單的說,就是你要監聽 redview 的哪個方法的調用?很明顯我們要的是 btnClick 這個方法

我們點進去這個 rac_signalForSelector 方法裡面看看

他給了我們一個信號的返回值,既然已經有信號了,那接下來我們就直接訂閱她!

我們來試試看他是不是真的可以被問聽到?

屏幕中的黃色警告來自於說,當前類裡面沒有 btnClick 方法

當我們在外面點擊按鈕的時候,這句話果然被列印了!

一般來說代理除了通知你還需要給你點數據,傳點參數。

回到我們的 redView 類裡面我們在寫一個方法帶有參數,然後我在按鈕點擊是裡面直接調用,然後我們給他一個參數叫做『我來了!』

當我點擊按鈕的時候,調用了 comming 這個方法。

回到控制器,我不在監聽 btnClick 了而是要監聽 comming 這個方法

而這個 comming 裡面是有參數的,參數現在就在我們的 x 裡面,所以我們來看看x 裡面的內容

這邊要說明一下,因為他列印不了中文,而他給我們的是一個什麼?是一個RACTuple元祖,這個裡面就是剛剛的那個中文了,不信的話我們改成英文試試看!

這說明了我們可以傳值,而且是任何東西都可以傳 因為我們的RACTuple是可以放出任意對象的為了證明他可以我們再來實驗一下,這個 btnClick 裡面有個 sender 他是一個按鈕對吧,假設我們現在監聽 btnClick 這個方法,然後這個時候 x 應該會列印出我們的按鈕 UIbutton 對吧?

在這邊我們再一次得到了證明,

接下來我們說明一下代替 kvo 上次我們介紹過重寫 kvo,在這邊實際運用一下

之前我們提到的 監聽的時候要用 addObsever 這個方法這是系統自帶的 KVO 那麼現在我要用RAC 的 該怎麼做?

首先我們要專門導入一個頭文件

#import 「NSObject+RACKVOWrapper.h"

單獨導入他,這邊很明顯看出來他是一個分類

接下來我們來使用 rac_observeKeyPath 這個方法了,這就是 RAC 的KVO

我們來看看,首先我要監聽他的 frame , 然後 option 部分進行一個 NSKeyValueObservingOptionNew 操作,observer 這邊我們不用傳,以前我們在這邊寫的是self,這邊我們直接給他一個 nil 就可以了!

接下來我們進入到這個 block 了嗎看看要做些什麼?

這個 block 他是一個回調,一但監聽到我們的 frame 發生了變化,立刻回調。這樣做有什麼好處?現在我在監聽redView的回調,後面還可能會有監聽他的別的屬性,如果我們使用系統自帶的 KVO 的話是不是還要再添加兩個觀察者?而且進去之後我們還要進行判斷說到底是哪個監聽者監聽哪個屬性?請想像一下~假設今天我們有十個屬性呢?是不是很麻煩啊?

接下來我們介紹另一種方式來使用 KVO, RAC 他有一個專門的 rac_valuesForKeyPath 這個方法專門觀察 redview的某一個屬性

[_REDView rac_valuesForKeyPath:@"frame" observer:nil];

就這樣一句代碼,我們說明了讓他去監聽 redview 的 frame 屬性,他其實也就是創建了一個信號,既然他是創建信號,那我肯定能夠訂閱她對吧?

所以後面我們緊接著訂閱這個信號。

他果然可以拿到我們 button 的 frame, 我們試著改變他一下,

果然是可以了吧!那麼她可不斷的監聽嗎?

我們再來試試看

我們對他進行一個變數,然後不斷的點他。

他也一樣是能做到的!

接下來我們進入到監聽事件的部分了,我們在 storyBoard 了嗎再拖一個按鈕把它命名為 btn

之前我們要監聽的話是不是 addTarget 來監聽事件,那麼現在我們用 RAC 來監聽事件該怎麼處理?

我們讓按鈕調用 rac_signalForControlEvents 這個方法,他的返回值是一個 RACSignal

這說明他其實是一個信號!

簡單的說這個方法就是『把按鈕的事件轉成信號』

[_btn rac_signalForControlEvents:(UIControlEventTouchUpInside)];

現在我們把 按鈕的 TouchUpInside 事件轉成信號,既然他是一個信號那我們是不是直接訂閱她?那我們就直接來看看說他的信號內容是什麼?

很明顯他來了一個 UIBtton 這也就是函數編成的思想了,所有的東西都弄再一起了。

接下來我們試試看怎麼代替通知?

之前我們要通知的時候是不是先拿到我們的通知中心再說~

[NSNotificationCenter defaultCenter];

那今天我們要怎麼添加一個通知?那就是之前我們要通知的時候是不是我們之前提供的方式了~

今天我不想用原來的方式了~該怎麼用 RAC 來做呢?

我們同樣需要[NSNotificationCenter defaultCenter]這個通知中心 然後調用這個方法 rac_addObserverForName

他只需要兩個參數!哪兩個參數?

一個是要監聽哪個通知?假設我今天要監聽鍵盤彈出好了~

另一個是誰發的通知? 給他一個 nil 表示誰發的我都要

毫不意外,他的返回值也是一個信號,那麼既然是信號的話我們就訂閱他吧,同樣的我們把信號內容給列印出來!

這個參數到底會是什麼呢?

我們來試試看吧?現在我們往 storyBoard 上面放上一個文本匡然後看看當鍵盤彈出的時候會發生什麼事情?

從來都不知道通知也能這麼爽對吧~

列印內容我們來看這一對

userInfo = {

UIKeyboardAnimationCurveUserInfoKey = 7;

UIKeyboardAnimationDurationUserInfoKey = 「0.25″;

UIKeyboardBoundsUserInfoKey = 「NSRect: {, }";

UIKeyboardCenterBeginUserInfoKey = 「NSPoint: ";

UIKeyboardCenterEndUserInfoKey = 「NSPoint: ";

UIKeyboardFrameBeginUserInfoKey = 「NSRect: {, }";

UIKeyboardFrameEndUserInfoKey = 「NSRect: {, }";

UIKeyboardIsLocalUserInfoKey = 1;

}}

這就是鍵盤的所有信息。

最後我們來到監聽文本匡的輸入,正好前面我們有個文本匡,現在我們把它關聯一下

以前我們要監聽文本匡的輸入也就是每次輸入一個值我就要拿到他該怎麼做?

是否我們就只能告 delegate 了?

_text.delegate = self;

現在我們有RAC 之後呢?

它提供了一個 rac_textSignal 方法,不要懷疑 不要猶豫 他的返回值也是,信號~

所以我們再來訂閱她看看

二話不說我們先來運行看看!

是不是到這邊已經有一種對他相遇的太晚的感覺呢?

現在還不玩抓住你的幸福吧!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 公眾號 的精彩文章:

看點在最末-賣個小關子
成像圖像中如何有效識別裂縫
票房黑洞 奧遜·威爾斯
宋宋CP終成眷屬!這些絕美旅行地可讓你撒足狗糧!
邢台名吃——任縣老炒肉

TAG:公眾號 |

您可能感興趣

UNDER ARMOUR CURRY 6「ROARACLE」
PURERACE 靈感
「神褲」 YEEZY CALABASAS TRACKPANT 新色登場!
加速快過F1?品鑒BMW全新HP4 RACE
PUMA以全新PLATFORM TRACE鞋款演繹肆意風潮
英式CAFE Racer風格 凱旋 THRUXTON 1200R
HTC首部影院級VR電影《7 MIRACLES》上線,售價133元
GRACE CHEN的普世中國美
利勃登 LIBRATONE TRACK Air 真無線藍牙耳機 圖集 「Soomal」
利勃登 LIBRATONE TRACK Air 真無線藍牙耳機 圖集Soomal
台灣GRACEGIFT又出招 TSUM TSUM春夏時裝系列
RAC 攜手 UBIQLab 打造全新客製鞋款
利勃登 LIBRATONE TRACK Air 真無線藍牙耳機測評報告 「Soomal」
NIKE MOON RACER 限量登陸發售
一面藝術 一面性能 ROG HURACAN G21電競台式機評測
SoleFly x JORDAN 88 RACER即將超限量發售
AMD重回伺服器:Oracle甲骨文宣布將使用AMD EPYC處理器
視點丨GRACE TANG藝術珠寶 2018中法高級藝術珠寶展再放光彩
3/14 SUBTRACTION 港味
NIKE AIR HUARACHE CITY LOW 女子運動鞋款式:AH6804-600