2012-07-26 63 views
2

我有兩個UIViewControllerios塊示例。如何創建塊目標c

  • MainVC
  • PickerVC

在主視圖控制器我有IBAction爲方法: - showPickerView

在這種方法我需要創建塊,它將呈現PickerVC視圖並等待我,同時在PickerVC視圖上選擇某個值並按下完成按鈕。

在這個塊中,我需要實現回調,在按下完成按鈕後,它將調用MainVC中的方法。

所以,我之前使用過塊,但我不知道如何自己實現它。

我認爲,第一部分將是這個樣子:

- (IBAction)showPickerView { 
    __block PickerVC *pickerVC = [[PickerVC alloc] init]; 
    [pickerVC setFinishBlock:^{ 
     // Do something after user press on Done button 
    }]; 
    [pickerVC setFailedBlock:^{ 
     // Do something if something wrong (but this method optional) 
    }]; 
    [pickerVC showPicker]; 
} 
+0

如果你需要一個回調你爲什麼不嘗試創建一個協議並使用委託方案?或者你爲什麼不使用'NSNotificationCenter' ...? – holex 2012-07-26 10:50:35

+0

[此頁](http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html)包含您需要的所有信息。 – borrrden 2012-07-26 09:43:16

回答

7

添加在PickerVC的頭的兩種類型定義

typedef void (^FinishBlock)(); 
typedef void (^FailedBlock)(); 

和你setFinishedBlock的聲明採用FinishBlock

- (void)setFinishBlock:(FinishBlock)finishBlock; 
- (void)setFailedBlock:(FailedBlock)failedBlock; 

爲每個區塊製作一個iVar

@interface PickerVC : UIViewController 
{ 
    FinishBlock _finishBlock; 
    FailedBlock _failedBlock; 
} 

在你的setFinishedBlock:setFailedBlock:定義只要PickerVC失敗或完成呼叫_failedBlock_finishedBlock設置參數爲高德

__block語句用於變量在塊中使用時保留在內存中。所以你不需要它在上面的代碼

+0

感謝這個代碼:)但我怎麼能調用_failedBlock? – 2012-07-26 10:28:19

+0

像一個c函數_failedBlock(); – zeiteisen 2012-07-26 10:57:28

+0

確保首先檢查nil:'if(_failedBlock)_failedBlock();' – 2012-07-27 20:17:29