2011-01-26 5 views
0

私は数ヶ月前に残したCocoaプロジェクトで作業を再開しました。あなたがしばらくそれを使用していない場合、ココアは変な獣です。とにかく警告:MyClass:NSObjectはキー値監視を実装していませんか?どのようにすることができますか?

、いくつかの点で、コンパイラが警告を落とし始めた:クラスの不完全履行のための「MyClassの」
メソッドの定義

「を-addObserver:forKeyPath:オプション:コンテキスト」の
メソッドの定義が見つかりません。 '-removeObserver:forKeyPath:' 完全に 'MyZoomScrollViewDataSource' を実装していない
クラス 'MyClassの' になっていないプロトコル

しかし、MyClassNSObjectに由来し、実際に-addObserver:forKeyPath:-removeObserver:forKeyPath:context:を実装しています。

プロトコルは、次のようになります。私は私のココアのスキルは、リフレッシュのための深い必要としていると思います

@interface MyClass : NSObject <MyZoomScrollViewDataSource> { 
    IBOutlet Outlets... 
    variables... 
} 
@properties... 
(IBAction)actions... 
- methods... 
@end 

@protocol MyZoomScrollViewDataSource 
    // The range of Data that should be shown. This corresponds to the horizontal 
    // zoom and the scroll value of self. 
    @property FRange selectionRange; 

    // Also, make sure the dataSource is KVO compliant 
    - (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; 
    - (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath; 
@end 

クラスは次のようになります。しかし、これらのメソッドはNSObjectから継承する必要がありますが、どうしてMyClassではこれらのメソッドを実装できませんか?

+0

'MyClass'は' NovaController'と同じですか? –

+0

@Bavarious:はい、そうです。私はそれに応じて問題を修正した。 – bastibe

答えて

1

これらの機能をクラスに明示的に追加することもできます。これは私にはむしろハックに見えます。もしあれば私は喜んでこれを行うためにきれいな方法を使用します。

@implementation MyClass 

- (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context { 
    [super addObserver:anObserver forKeyPath:keyPath options:options context:context]; 
} 

- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath { 
    [super removeObserver:anObserver forKeyPath:keyPath]; 
} 

@end 

奇妙なことがある:これはsuperていないだけで動作しますが、それはあまりにも、selfで動作します!私の心は吹き飛ぶと考えてください。何が一体?

+0

それはコンパイルするという意味では機能しますか、それは動作するという意味では機能しますか?それは私のループのように見えます。 –

+0

それはヒッチなしで実行されます!それは私のループのようにも見えます。ココア、あなたは何をしていますか? – bastibe

0

実際、私は自分の答えで急いでいました。

なぜプロトコルでKVOメソッドを宣言していますか? NSObjectは既にそれらの基本バージョンを実装していますか?

+0

私はそれらのメソッドを 'DataSource'で使用します。私がそれらを宣言しなければ、私は警告: 'removeObserver:forKeyPath:'プロトコルで見つけられません。 – bastibe

+0

'DataSource'と言うと、' NovaController'クラスですか? – Abizern

+0

正しいと思います。私はそれに応じて問題を修正した。これまではあまり意味がありませんでしたか? – bastibe

3

答えは質問です!

コンパイラ警告:

-addObserver:forKeyPath: 
-removeObserver:forKeyPath:options:context: 

プロトコル:

-addObserver:forKeyPath:options:context: 
-removeObserver:forKeyPath: 

目は良く見えます。あなたは​​コンパイラオプションを使用することにより、これらの警告を回避することができるはず

+0

ああ、私の悪い。それは質問のタイプミスでした。私はその問題を修正した。 – bastibe

2

クラスは、プロトコルを実装するために宣言されている場合は、警告がで実装されていないプロトコル内のすべてのメソッドのために発行されますクラス。デフォルトの動作では、メソッドの実装がスーパークラスから継承されていても、クラスに明示的に実装されていないすべてのメソッド()に対して警告を発行します。​​オプションを使用すると、スーパークラスから継承したメソッドが実装されているとみなされ、警告は発行されません。

+0

これは、スーパークラスから継承したメソッドを使用することを正式にはお勧めしないということですか? – bastibe

+0

@BastiBechtold必ずしもそうではありません。私はコンパイラが(過度に)保守的であると思う。特定のプロトコルでは、サブクラスもプロトコルメソッドを実装する必要があるかもしれないからだ。あるいは、クラスが(スーパークラスにかかわらず)それが採用するプロトコルに必要なメソッドを実装しなければならないことを文字通り考えているかもしれません。 –

関連する問題