2012-07-10 36 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