我們可以把Block當做Objective-C的匿名函數。Block允許開發者在兩個對象之間將任意的語句當做數據進行傳遞,往往這要比引用定義在別處的函數直觀。另外,block的實現具有封閉性(closure),而又能夠很容易獲取上下文的相關狀態信息。定義Block變量,就相當于定義了一個函數。但是區別也很明顯,因為函數肯定是在-viewDidLoad方法外面定義,而Block變量定義在了viewDidLoad方法內部。當然,我們也可以把Block定義在-viewDidLoad方法外部,例如上面的代碼塊printNumBlock的定義,就在-viewDidLoad外面。
第二個viewcontroller控制第一個button的title
跳轉的時候,button的selector()
- (void)SecondVc{ SecondViewController *svc = [[SecondViewController alloc] init]; // Block 傳值 svc.secondBlock = ^(){ NSLog(@"First->Second"); [self.button setTitle:@"23" forState:UIControlStateNormal]; }; [self.navigationController pushViewController:svc animated:YES]; }
第二個viewcontroller.h的聲明:
typedef void (^SecondController)(); @interface SecondViewController : UIViewController /** block */ @property (nonatomic, copy) SecondController secondBlock; @end
第二個viewcontroller.m的touchesBegan方法:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"second view controller"); if (_secondBlock) { _secondBlock(); } }
新聞熱點
疑難解答