2011-01-26 82 views
0

我最近剛剛恢復了幾個月前離開的Cocoa項目的工作。可可是一個奇怪的野獸,如果你沒有使用它一段時間。警告:MyClass:NSObject沒有實現鍵值觀察?怎麼可能?

無論如何,在某些時候,編譯器開始下降警告:

完全執行類「MyClass的」
方法定義爲「-addObserver:forKeyPath:選擇:上下文」未找到
的 方法定義'-removeObserver:forKeyPath:' 未找到
類 'MyClass的' 不全面貫徹 'MyZoomScrollViewDataSource' 協議

MyClass源自NSObject,其實際上實施-addObserver:forKeyPath:-removeObserver:forKeyPath:context:

協議看起來是這樣的:

@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 

類看起來是這樣的:

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

我想我的可可技能是深需要刷新。但是,這些方法仍然應該從NSObject繼承,那麼MyClass不能實現這些方法?

+0

「MyClass」與「NovaController」相同嗎? – 2011-01-27 08:36:13

+0

@Bavarious:是的。我相應地糾正了這個問題。 – bastibe 2011-01-27 08:48:20

回答

1

對此的一種可能的解決方案是明確地將這些函數添加到類中。這對我來說似乎相當ha ish。如果有的話,我會很樂意用更清晰的方式來做到這一點。

@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

其實我對我的回答很倉促。

你爲什麼要在協議中聲明KVO方法。 NSObject已經實現了它們的基本版本?

+0

我確實在`DataSource`上使用了這些方法。如果我沒有聲明它們,我會得到`WARNING:'-removeObserver:forKeyPath:'在協議中找不到'我正在使用它們的地方。 – bastibe 2011-01-26 15:53:17

+0

當你說`DataSource`你的意思是`NovaController`類? – Abizern 2011-01-26 16:00:25

+0

正確,我這樣做。我相應地糾正了這個問題。直到現在它並沒有太多意義,是嗎? – bastibe 2011-01-27 08:47:40

3

答案在問題中!

的編譯器警告:

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

協議:

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

第二看起來更好。

2

您應該能夠通過使用​​編譯器選項,以避免這些警告:

如果一個類被聲明爲實現協議,將發出警告。協議中的每一個方法不是由執行發行班上。默認行爲是爲類中未明確實現的每個方法發出警告,即使方法實現是從超類繼承的,也可以使用如果使用​​選項,則從超類繼承的方法被視爲已實現,並且不會發出警告。