先前我們利用自訂代理人的方式將值回傳,參考這篇,現在我們要利用Block的方式將值回傳。
使用Block的3個步驟:
1. 宣告Block。
2. 實作Block。
3. 呼叫Block。
Block可以想成是匿名的Function,Block的最大好處就是可以在別的method內實作,取得method內的區域變數。
【專案開發步驟】
建立專案:
請參考這篇。
設計使用者介面:
請參考這篇。
修改DetailViewController.h檔案:
撰寫使用Block的步驟1,宣告Block,如下所示,將Block宣告在@interface區,讓其他的Class也可以使用。
@property (copy, nonatomic) void (^passVale)(NSString*);
有宣告Property代表可以getter跟setter,一定要使用copy。
修改DetailViewController.m檔案:
撰寫使用Block的步驟3,呼叫Block,如下所示。
- (IBAction)click:(UIButton *)sender {
self.passVale(self.nameField.text);
[self.navigationController popToRootViewControllerAnimated:YES];
}
當DetailViewController接收到按鈕按下後會執行click這個function,呼叫passValue這個function,並傳送TextField內的文字。NavigationController傳送message,請求回到Root View Controller。
修改MainViewController.m檔案:
撰寫使用Block的步驟2,實作Block,如下所示。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
DetailViewController *detailViewController = segue.destinationViewController;
detailViewController.passVale = ^(NSString *name) {
self.nameLabel.text = name;
};
}
利用prepareForSegue抓到DetailViewController的指標。實作Block的method,會傳NSString過來,此時使用UILabel去接收它即可。
【執行結果】
【專案範例】
沒有留言:
張貼留言