2014年8月15日 星期五

Pass Value by Block programmatically using Object-C language

【說明】

先前我們利用自訂代理人的方式將值回傳,參考這篇,現在我們要利用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去接收它即可。


【執行結果】

    

    


【專案範例】

沒有留言:

張貼留言