- 很久之前就想怎么用好block明吩,面試的時候也被問到block會不會用,用的多么殷费。印荔。。感覺block用起來特帥有木有详羡。仍律。。
- 自我感覺实柠,一個iOS程序員中級低級分水嶺就在于水泉,會不會用block。一段代碼好不好,最直觀的體驗就是1草则,方法封裝了沒钢拧,2,block用的多不多炕横。源内。。(個人意見份殿,不喜勿噴)
今天系統(tǒng)寫了些關(guān)于block的一些變量定義跟方法調(diào)用
首先膜钓,block到底怎么用,什么時候用伯铣,怎么才能想到去用呻此,應(yīng)該是一個新手程序員最頭疼的問題
- block就像一個小弟一樣,誰要用的時候腔寡,叫過來焚鲜,讓block過一遍就好了,跟函數(shù)的方法一樣放前,block里的具體內(nèi)容忿磅,在調(diào)用之前寫好,在調(diào)用的時候才會執(zhí)行凭语。
- delegate就是委托葱她,A委托給B去執(zhí)行,告訴B執(zhí)行什么似扔,B還需要簽署一個委托書吨些,相對而言是很麻煩的。
下面炒辉,為具體給出一個block簡單的具體寫法豪墅,讓大家感受一下大體的流程
- 第一個demo
要求:
我們首先創(chuàng)建兩個控制器,第一個控制器的頁面上有一個label和一個按鈕A黔寇,第二個控制器的頁面上有一個textField和一個按鈕B偶器,在textField上隨便輸入一串文字,點擊按鈕B缝裤,跳轉(zhuǎn)會第一個頁面屏轰,講輸入的文字展示在label上。
思路:
把這個賦值操作當(dāng)作小弟(block)
我們一邊整理思路憋飞,一邊上代碼
- 1.首先霎苗,點擊第二個控制器的按鈕B,需要讓label的文字改變搀崭,我們把label改變看作block叨粘,在點擊按鈕的時候調(diào)用
#import <UIKit/UIKit.h>
// 給block起個名兒
typedef void(^blockBack)(NSString *tf);
@interface NextViewController : UIViewController
/** block猾编,注意block用copy修飾,但是不帶“*”號 */
// strong也可以升敲,但是建議copy
@property (nonatomic, copy) blockBack tfblock;
@end
#import "NextViewController.h"
@interface NextViewController ()
@property (weak, nonatomic) IBOutlet UITextField *tf;
@end
@implementation NextViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
// 點擊按鈕
- (IBAction)sentTo:(id)sender {
// 叫小弟(block)過來答倡,讓他做事
if (_tfblock != nil) {
NSString *str = _tf.text;
_tfblock(str);
}
[self dismissViewControllerAnimated:YES completion:^{}];
}
@end
- 2.小弟(block)要做的事是講textField上的文字賦給label,所以驴党,我們應(yīng)該在拿到label的那個控制器做事情瘪撇,也就是說,
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// 拿到第二個頁面港庄,讓label.text = textField
// 這個賦值運算就是小弟(block)干的事兒
NextViewController *vc = segue.destinationViewController;
vc.tfblock = ^(NSString *str){
_label.text = str;
};
}
- 3.這樣我們整個流程就走通了倔既,想法其實很簡單,控制器B想執(zhí)行賦值操作鹏氧,但是拿不到A的label渤涌,所以叫了一個含有l(wèi)abel賦值代碼的小弟
(block)過來執(zhí)行。
上面這個demo有個很明顯的弊端把还,就是我們在寫這些block的時候实蓬,全程手打所有的符號,這樣很不方便吊履,所以安皱,我們來寫第二個demo,利用回調(diào)
要求:
控制器上有個按鈕艇炎,點擊按鈕酌伊,讓他顏色改變成固定顏色,
思路:
把這個改變顏色事件當(dāng)成一個做事的小弟(block)
- 1.寫一個類缀踪,繼承NSObjected寫這個block事件
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
// 定義一個block居砖,取個名兒
typedef void(^ChangeColor)(UIColor *color);
@interface ColorBtn : NSObject
// 直接寫回調(diào)方法,把這個block當(dāng)做參數(shù)傳出驴娃,不用單獨定義block
+ (void)ChangeViewBtnColor:(ChangeColor)changeColorBlock;
@end
#import "ColorBtn.h"
@implementation ColorBtn
+ (void)ChangeViewBtnColor:(ChangeColor)changeColorBlock
{
NSLog(@"進來了");
// color參數(shù)傳出
UIColor *color = [UIColor redColor];
// 調(diào)用block做事
changeColorBlock(color);
}
@end
- 2.在控制器里面的按鈕點擊方法中執(zhí)行這個block
- (IBAction)colorBtn:(id)sender {
[ColorBtn ChangeViewBtnColor:^(UIColor *color) {
[_colorBtn setBackgroundColor:color];
}];
}
- 3.搞定悯蝉,回調(diào)的寫法就是能省區(qū)很多手打的內(nèi)容,全程提示默認(rèn)托慨,很方便
可能看著有點混亂,但是基本就是這么個思路暇榴,把block想成小弟來看厚棵,就能了解到什么時候考慮去用這個block了