iPhone: протокол обмена / код делегата - PullRequest
1 голос
/ 27 марта 2010

У меня есть следующие фрагменты протокола кода:

@ протокол FooDelegate;

@ interface Foo: UIViewController { идентификатор делегата; } ...

@ протокол FooDelegate ... // метод 1 ... // метод 2 ... @ Конец

Кроме того, следующий код, который реализует FooDelegate:

@ interface Bar1: UIViewController {...}

@ interface Bar2: UITableViewController {...}

Оказывается, реализация FooDelegate одинакова для классов Bar1 и Bar2. В настоящее время я просто копирую код реализации FooDelegate из Bar1 в Bar2.

Как мне структурировать / реализовать таким образом, чтобы Bar1 и Bar2 совместно использовали один и тот же код в одной кодовой базе (а не в настоящее время с 2 копиями), поскольку они одинаковы?

Заранее спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 28 марта 2010

Вариант A: реализовать метод в категории

Все используемые свойства должны быть объявлены в UIViewController.

UITableViewController является подклассом UIViewController.

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

//UIViewController+MyAdditions.m

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

Новый метод, добавленный к UIViewController, будет унаследован Bar1 и Bar2

Вариант B: Создать MyViewControllerHelper класс

Если вы можете реализовать свой общий код как метод класса, в противном случае вам потребуется создать экземпляр вашего вспомогательного класса либо временно, либо как свойство Bar1 и Bar2

@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
0 голосов
/ 27 марта 2010

Создание нового объекта, MyFooDelegate:

@interface MyFooDelegate : NSObject <FooDelegate>

Тогда Bar1 и Bar2 могут каждый создать его экземпляр (или совместно использовать один экземпляр). В этих классах вы можете исключить методы делегата и добавить такие строки, как:

MyFooDelegate *myDooDelegateInstance = ...;

foo.delegate = myFooDelegateInstance;

Вы также можете создать экземпляр MyFooDelegate в файле NIB и при желании подключить к нему выходы делегатов контроллера представления.

Таким образом, у вас не будет дублированного кода в исходных файлах или исполняемых файлах.

...