Вы не можете определять категории для протоколов. Есть 2 способа обойти это:
- использовать новый формальный протокол
- использовать неофициальный протокол и проверку во время выполнения
Формальный протокол
Определение нового формального протокола будет выглядеть так:
@protocol MyCustomMatrixDelegate <NSMatrixDelegate>
- (void) myNewMethod:(id)sender;
@end
Тогда вы бы сделали свой пользовательский класс соответствующим <MyCustomMatrixDelegate>
вместо <NSMatrixDelegate>
. Если вы используете этот подход, есть кое-что, о чем следует знать: [self delegate]
, скорее всего, будет объявлено как id<NSMatrixDelegate>
. Это означает, что вы не можете сделать [[self delegate] myNewMethod:obj]
, потому что <NSMatrixDelegate>
не объявляет метод myNewMethod:
.
Способ обойти это - перепечатать delegate
объект с помощью приведения. Может быть что-то вроде:
- (id<MyCustomMatrixDelegate>) customDelegate {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
(Тем не менее, вы можете сначала выполнить проверку типа, например:
if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
return nil;
)
И тогда вы сделаете:
[[self customDelegate] myNewMethod:obj];
Неофициальный протокол
Это действительно необычное название для категории NSObject
:
@interface NSObject (MyCustomMatrixDelegate)
- (void) myNewMethod:(id)sender;
@end
Тогда вы просто не реализуете метод. В вашем классе, который отправит метод, вы должны сделать:
if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {
[[self delegate] myNewMethod:someSenderValue];
}