2012-07-10 62 views
1

我很想知道實現以下共識設計模式:實施2個不同的委託來處理事件的UIImagePickerController

我有2個按鈕允許用戶執行不同任務的主視圖,這些都需要圖像選擇使用UIImagePickerController(假設任務1 =「選擇/拍攝foo類型的照片」和任務2 =「選擇/拍攝類型bar」的照片)。目前我實施在其中介紹了UIIPC視圖控制器的<UIImagePickerControllerDelegate>協議,然而給出我需要委託方法2個不同的反應:

 - (void) imagePickerController: (UIImagePickerController *) pickerdidFinishPickingMediaWithInfo: (NSDictionary *) info 

取決於用戶是否選擇了一個或foo照片bar I」 m有興趣實施2種不同<UIImagePickerController>委託方法的最佳方式。包含在呈現視圖控制器中並實例化兩次的獨立委託對象是否最適合? (我在iOS上只有幾個星期的時間,所以仍然擁抱設計模式)。

回答

2

如果創建採摘作爲頭屬性,你可以做pickeryourPicker之間的comparisson的委託方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
+0

當然,我真的應該的我自己也想到了。我猜,百事可樂Max還不夠。乾杯。 – NSTJ 2012-07-10 17:53:48

0

聲明兩個不同的代表。最好的辦法是,永遠不要實例化相同的委託兩次,因爲它最終會在你的代碼中發生奇怪的事情。

在你UIImagePickerController.h寫:

#pragma mark - Protocols advance declarations 
    @protocol imageTypeADelegate 
    @required 
     -(void) takeImageOfTypeA:(id)object; 
    @end 

    #pragma mark - Protocols advance declarations 
    @protocol imageTypeBDelegate 
    @required 
     -(void) takeImageOfTypeB:(id)object; 
    @end 

將它們添加到你的財產申報這樣

#pragma mark - Property declarations 
    @property (assign) id <imageTypeADelegate> typeADelegate; 
    @property (assign) id <imageTypeADelegate> typeBDelegate; 

然後您在.m文件中加入:

#pragma mark - Protocols 
    -(void) pressedButtonToTakeImageOfTypeA:(id)sender; 
    { 
     [[self _typeADelegate] takeImageOfTypeA:(id)object]; 
    } 
    -(void) pressedButtonToTakeImageOfTypeB:(id)sender; 
    { 
     [[self _typeBDelegate] takeImageOfTypeB:(id)object]; 
    } 

然後,無論你需要什麼課程,他們都可以運行例程OU要做的就是它添加到你想要的.H它來通知

#import "UIImagePickerController.h" 
    @interface OtherViewController : UIViewController <imageTypeADelegate, imageTypeBDelegate> 

,並在您的m某處

-(void) takeImageOfTypeA:(id)object; 
{ 
    // Do something 
} 

-(void) takeImageOfTypeA:(id)object; 
{ 
    // Do something 
} 

/〜完線

+0

有趣。你認爲這是一種優越的設計模式,將呈現視圖控制器分配給委託,然後在呈現'UIIPC'時切換屬性集? (我將Javier的回答擴展了一點,在提出每個選擇器之前設置一個'BOOL'來表示它的類型)。 – NSTJ 2012-07-10 18:18:08

+0

我相信,儘管選擇的答案是一個更簡單和優雅的方法,但它有小但嚴重的缺陷。如果您在受限環境下運行,該標誌可能會給您一個錯誤的訪問權限。我描述的方法產生更穩定的運行時例程。但是,嘿,我是老派,並試圖通過阻力最小的路徑流通代碼 – 2012-07-10 18:36:10

+0

謝謝 - 我選擇了亞歷杭德羅的答案,因爲它解決了我的問題,但我同意你的觀點在代表團中是正確的。所以不給我一個divideAcceptanceBy2()方法意味着他最終接受了。無論如何,你的回答爲委派提供了很多亮點,歡呼。 – NSTJ 2012-07-10 18:47:48