Отличный ответ. Формальный способ протокола работал отлично!

у расширить или добавить другой метод к существующему протоколу. Хотя протокол, в частности, не важен, это то, что я пытаюсь сделать.

@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end

Компилятор предупреждает, что у меня есть дубликат объявления того же протокола. Как бы я сделал это правильно?

Благодарю.

Ответы на вопрос(1)

Решение Вопроса

и это:

использовать новый формальный протоколиспользовать неформальный протокол и проверку во время выполненияФормальный протокол

Определение нового формального протокола будет выглядеть так:

@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];
}
 Dave DeLong08 янв. 2011 г., 21:47
@ Дэвид отредактировал ответ
 Fmessina22 апр. 2011 г., 10:15
Отличный ответ. Формальный способ протокола работал отлично!
 David08 янв. 2011 г., 21:56
Вы великолепны. Работает как шарм. Спасибо.
 David08 янв. 2011 г., 21:31
Я попробовал метод Формального протокола. Это работает, однако компилятор предупреждает, что пользовательский метод не может быть найден в протоколе. Я добавил формальный протокол в интерфейс делегата и включил заголовок делегата в файл реализации объекта, которому я отправляю сообщение делегата. У вас есть идея, почему она все еще жалуется? Спасибо

Ваш ответ на вопрос