iPhone:共享协议/代理代码

时间:2010-03-27 18:52:58

标签: iphone delegates protocols

我有以下代码协议摘要:

@protocol FooDelegate;

@interface Foo:UIViewController {      id代表;   }   ...

@protocol FooDelegate   ...... //方法1   ...... //方法2   ...   @end

此外,以下代码实现了FooDelegate:

@interface Bar1:UIViewController {...}

@interface Bar2:UITableViewController {...}

事实证明,在Bar1和Bar2类中,FooDelegate的实现是相同的。我目前只是将FooDelegate实现代码从Bar1复制到Bar2。

如何以一种方式构建/实现Bar1和Bar2在单个代码库中共享相同的代码(不是当前有2个副本),因为它们是相同的?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

选项A:在类别中实施方法

使用的任何属性都必须在UIViewController中声明。

UITableViewControllerUIViewController的子类。

//UIViewController+MyAdditions.h
@interface UIViewController (MyAdditions)
- (void)myCommonMethod;
@end

//UIViewController+MyAdditions.m

@implementation UIViewController (MyAddtions)
- (void)myCommonMethod {
// insert code here
}

添加到UIViewController的新方法将由Bar1Bar2继承

选项B:创建MyViewControllerHelper

如果可以,请将您的公共代码实现为类方法,否则您需要暂时或作为Bar1Bar2

的属性创建助手类的实例
@interface MyViewControllerHelper : NSObject
- (void)myCommonMethod;
@end

@implementation MyViewControllerHelper
- (void)myCommonMethod {
    // common code here
}

@interface Bar1 : UIViewController {
MyViewControllerHelper *helper;
}
@property MyViewControllerHelper *helper;
@end

@implementation Bar1
@synthesize helper;
- (void)someMethod {
    [helper myCommonMethod];
}
@end

@interface Bar2 : UITableViewController {
MyViewControllerHelper *helper;
}
@property MyViewControllerHelper;
@end

@implementation Bar2
@synthesize helper;
- (void)someOtherMethod {
    [helper myCommonMethod];
}
@end

答案 1 :(得分:0)

创建一个新对象MyFooDelegate:

@interface MyFooDelegate : NSObject <FooDelegate>

然后Bar1和Bar2都可以创建它的实例(或共享一个实例)。在这些类中,您可以消除委托方法并添加如下行:

MyFooDelegate *myDooDelegateInstance = ...;

foo.delegate = myFooDelegateInstance;

如果需要,您还可以在NIB文件中创建MyFooDelegate实例,并将视图控制器的委托出口连接到它。

这样,您的源文件或可执行文件中就不会有任何重复的代码。