У меня есть контроллер представления, который определяет протокол, который сам наследует другой протокол. Я хочу, чтобы любой объект, который реализует мой протокол, также реализует унаследованный протокол.объектив c пересылка сообщения с переадресациейTargetForSelector не всегда работает
Я хочу, чтобы установить свой класс, чтобы перехватывать некоторые из сообщений в унаследованном протоколе для того, чтобы настроить некоторые вещи внутри, но в конечном счете, хотел бы направить все сообщения на делегат моего класса
Я мог бы написать много кода плиты котла, чтобы заглушить весь протокол, и стажер вызовет делегата, но я вижу, что он ломается много времени - в любое время, когда изменяется «супер» протокол, мне нужно снова создать этот класс.
Я вижу, что это очень преобладает в пользовательских элементах управления пользовательским интерфейсом. При повторном использовании существующих компонентов - например, таблиц или представлений коллекции, вы хотели бы, чтобы ваш источник данных отвечал на все распространенные протоколы, но в некоторых случаях вам нужно настроить представление в соответствии с индексом или сохранить определенное состояние.
Я попытался с помощью forwardingTargetForSelector
для того, чтобы пересылать сообщения, которые я не отвечаю, но это не всегда экспедиторское ...
Вот надуманный пример кода:
Class A: (the top most protocol)
@
protocol classAProtocol <NSObject>
-(void)method1;
-(void)method2;
-(void)method3;
@end
My Class
@protocol MyClassProtocol <classAProtocol>
-(void)method4;
@end
@interface MyClass
@property (nonatomic,weak> id <MyClassProtocol> delegate;
@end
@interface MyClass (privateInterface)
@property (nonatomic,strong) ClassA *classAObject;
@end
@implementation MyClass
-(init)
{
self = [super init];
if (self)
{
_classAObject = [[ClassA alloc] init];
_classAObject.delegate = self; // want to answer some of the delegate methods but not all
}
}
-(void)method1
{
// do some internal configuration
// call my delegate with
[self.delegate method1];
}
-(id)forwardingTargetForSelector:(SEL)aSelector
{
if ([self respondsToSelector:aSelector])
{
return self;
}
if ([self.delegate respondsToSelector:aSelector])
{
return self.delegate;
}
return nil;
}
-(void)setDelegate:(id <MyClassProtocol>)delegate
{
self.delegate = delegate; // will forward some of the messages
}
@end
Попробую свои решения и вернуться к вам. –