2011-01-08 8 views
6

既存のプロトコルに別の方法を拡張または追加したいと考えています。特にプロトコルは重要ではありませんが、これが私がやろうとしていることです。ココアの既存のプロトコルにメソッドを追加するには?

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

コンパイラは、私は同じプロトコルの重複した宣言を持っていることを警告しています。どのように私はこれを正しく行うでしょうか?

ありがとうございました。

答えて

12

プロトコルのカテゴリを定義することはできません。

  • 使用新しい形式プロトコル
  • 新しい形式プロトコルを定義

形式プロトコル

をチェックする非公式のプロトコルおよびランタイムを使用し、次のようになります。この周りの2通りの方法があります。

@protocol MyCustomMatrixDelegate <NSMatrixDelegate> 

- (void) myNewMethod:(id)sender; 

@end 

次に、カスタムクラスをo <NSMatrixDelegate>の代わりに<MyCustomMatrixDelegate>です。このアプローチを使用する場合は、注意が必要なことがあります。[self delegate]はおそらくid<NSMatrixDelegate>と宣言されます。これは、<NSMatrixDelegate>myNewMethod:メソッドを宣言していないため、[[self delegate] myNewMethod:obj]を実行できないことを意味します。

これを回避する方法は、キャストを介して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]; 
} 
+0

私は正式なプロトコルメソッドを試しました。これは動作しますが、コンパイラはカスタムメソッドがプロトコルで見つからないことを警告します。私は、代理人のインターフェイスに正式なプロトコルを追加し、デリゲートのメッセージを送信しているオブジェクトの実装ファイルに代理人のヘッダーを含めました。あなたはまだそれが不平を言っている理由を知っていますか?ありがとう – David

+0

@David編集の回答 –

+0

あなたは素晴らしいです。魅力のように動作します。ありがとうございました。 – David

関連する問題