我把系統(tǒng)UIAlertView的代理寫成blocks了(增加runtime封裝)

當(dāng)一個(gè)控制器里面有很多UIAlertView 的時(shí)候祸泪,你要獲取當(dāng)前用戶操作的是那個(gè)UIAlertView 很是麻煩打颤,先你要設(shè)置他的tag 值生蚁,然后你在代理里面要判斷tag景东,要是有10個(gè),這時(shí)候你就凌亂了捆探,忘了自己設(shè)置了那個(gè)是哪個(gè)然爆。

那我們今天就把UIAlertView改成block回調(diào)方式站粟,大家可以參考參考黍图,順便把UIActionSheet,UIImagepickerViewcontroller 也寫成自己的blocks奴烙。
大家也跟我一起自定義個(gè)UIAlertView吧
還是先看下效果圖吧:

alert.gif

一.常規(guī)blocks封裝

1.新建一個(gè)繼承自NSObject的ICInfomationView
在ICInfomationView.h 文件中我們加入#import <UIKit/UIKit.h>
寫一個(gè)blocks 變量類型助被,我們下面使用
<pre>typedef void (^ClickAtIndexBlock)(NSInteger buttonIndex);</pre>
遵循 <UIAlertViewDelegate> 協(xié)議,因?yàn)槲覀冞€是用系統(tǒng)的

2.定義一個(gè)類方法切诀,我們這個(gè)方法接受我們在使用的時(shí)候傳入的參數(shù)
// 我們設(shè)置的參數(shù)名都是模仿系統(tǒng)的名字來的
<pre><code>+(UIAlertView )initWithTitle:(NSString)title message:(NSString *)messge cancleButtonTitle:(NSString )cancleButtonTitle OtherButtonsArray:(NSArray)otherButtons clickAtIndex:(ClickAtIndexBlock) clickAtIndex;
</code></pre>

在ICInfomationView.m文件中
在頭部我們定義一個(gè)static 的blocks 變量
static ClickAtIndexBlock _ClickAtIndexBlock;
-實(shí)現(xiàn)這個(gè)類方法
<pre><code>
+(UIAlertView )initWithTitle:(NSString)title message:(NSString *)messge cancleButtonTitle:(NSString )cancleButtonTitle OtherButtonsArray:(NSArray)otherButtons clickAtIndex:(ClickAtIndexBlock) clickAtIndex;

{
_ClickAtIndexBlock = [clickAtIndex copy];
UIAlertView *Al = [[UIAlertView alloc] initWithTitle:title message:messge delegate:self cancelButtonTitle:cancleButtonTitle otherButtonTitles: nil];
for (NSString *otherTitle in otherButtons) {
[Al addButtonWithTitle:otherTitle];
}
[Al show];
return Al;
}
</code></pre>

-實(shí)現(xiàn)UIAlertView 的兩個(gè)代理

<pre><code>

pragma mark UIAlertViewDelegate

+(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
_ClickAtIndexBlock(buttonIndex);
}

+(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
_ClickAtIndexBlock = nil;
}
</code></pre>

到此我們自己封裝的UIAlertView結(jié)束了揩环, 以后要是用的時(shí)候非常簡單,就一句代碼幅虑,再也不用tag值和遵守協(xié)議實(shí)現(xiàn)代理了
<pre></code>
[ICInfomationView initWithTitle:@"哈哈,我沒有使用代理丰滑,我是blocks" message:@"呵呵" cancleButtonTitle:@"好吧" OtherButtonsArray:@[@"嗯呢"] clickAtIndex:^(NSInteger buttonAtIndex) {
NSLog(@"click index ====%ld",(long)buttonAtIndex);
}];

</code></pre>

二.增加使用 runtime 封裝方法

runtime用的最多的就是關(guān)聯(lián)(Association)
1、建立關(guān)聯(lián)
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
參數(shù)解釋
object:關(guān)聯(lián)對象(id 可以為任意對象)
key :常量鍵
value:值(id 可以是任意值)
objc_AssociationPolicy:對象關(guān)聯(lián)策略

解釋:任意對象可以通過一個(gè)常量鍵關(guān)聯(lián)任意值

2倒庵、獲得關(guān)聯(lián)
objc_getAssociatedObject(id object, const void *key)

object:關(guān)聯(lián)對象(id 可以為任意對象)
key :常量
解釋:通過一個(gè)鍵獲得一個(gè)對象關(guān)聯(lián)值

本程序中用到的兩個(gè)方法
<pre></code>
-(void)setClickBlock:(ClickAtIndexBlock)block{
objc_setAssociatedObject(self, IC_alertView_Block, block, OBJC_ASSOCIATION_COPY);
}
-(ClickAtIndexBlock)clickBlock{
return objc_getAssociatedObject(self, IC_alertView_Block);
}
</code></pre>

UIAlertView原生代理調(diào)用

<pre></code>

pragma mark UIAlertViewDelegate

+(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (alertView.clickBlock) {

    alertView.clickBlock(buttonIndex);
}

}
</code></pre>

猛戳代碼github點(diǎn)擊代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褒墨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子擎宝,更是在濱河造成了極大的恐慌郁妈,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍申,死亡現(xiàn)場離奇詭異噩咪,居然都是意外死亡顾彰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門胃碾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涨享,“玉大人,你說我怎么就攤上這事书在』椅埃” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵儒旬,是天一觀的道長栏账。 經(jīng)常有香客問我,道長栈源,這世上最難降的妖魔是什么挡爵? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮甚垦,結(jié)果婚禮上茶鹃,老公的妹妹穿的比我還像新娘。我一直安慰自己艰亮,他們只是感情好闭翩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迄埃,像睡著了一般疗韵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侄非,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天蕉汪,我揣著相機(jī)與錄音,去河邊找鬼逞怨。 笑死者疤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叠赦。 我是一名探鬼主播驹马,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼除秀!你這毒婦竟也來了糯累?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤鳞仙,失蹤者是張志新(化名)和其女友劉穎寇蚊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棍好,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仗岸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年允耿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扒怖。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡较锡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盗痒,到底是詐尸還是另有隱情蚂蕴,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布俯邓,位于F島的核電站骡楼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稽鞭。R本人自食惡果不足惜鸟整,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朦蕴。 院中可真熱鬧篮条,春花似錦、人聲如沸吩抓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疹娶。三九已至伴栓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚓胸,已是汗流浹背挣饥。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工除师, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沛膳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓汛聚,卻偏偏與公主長得像锹安,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子倚舀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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