2014-09-04 75 views
-1

我有一個簡單協議稱爲內的屬性OnSuggestionTextChangedObjective-C中,協議作爲另一協議

@protocol OnSuggestionTextChanged <NSObject> 
-(void)onTextChanged:(NSString*)newText; 
@end 

我有另一個稱爲TextEditable協議具有這種協議作爲屬性

#import <Foundation/Foundation.h> 
#import "OnSuggestionTextChanged.h" 

@protocol TextEditable <NSObject> 

@required 
-(void)setTextString:(NSString*)text; 
-(NSString*)textString; 
-(void)notifySuggestionButtonPressed; 
-(NSInteger)cursorPosition; 

@property(nonatomic,weak)id<OnSuggestionTextChanged> onSuggestionTextChange; 

@end 

但在我的自定義UITextView它符合協議TextEditable

當我嘗試訪問屬性OnSuggestionTextChanged 我得到一個:

無法識別選擇爲[CustomTextView onSuggestionTextChanged]爲onTextChanged)

這是很奇怪因爲Xcode不會引發編譯器錯誤而是運行時錯誤。

你能告訴我,我想要做什麼是真的可能。如果是這樣,爲什麼我會得到無法識別的選擇器?

以防萬一你們不相信我。

enter image description here

+3

如果一個協議包含一個@屬性,那* NOT *表示該屬性現在是所有實現類的一部分。相反,它在遵守協議的類(如你的'UITextView'子類)中負責保證屬性的存在。請參閱:http://stackoverflow.com/a/844785/88111另外,正如@rmaddy在下面提到的,將'@ synthesize'添加到您的子類應該爲您生成getters/setters。 – 2014-09-04 14:27:10

+4

在符合'TextEditable'協議的類中,嘗試添加'@synthesize onSuggestionTextChange;'。 – rmaddy 2014-09-04 14:27:26

+2

在協議中使用屬性是不好的做法。你應該重新考慮你的協議。 – 2014-09-04 14:35:16

回答

0

回答我的問題在這裏:在協議中定義

屬性不會自動合成的,而不是你需要將它們合成在符合協議的類。

而且,我沒有收到一個編譯時錯誤,但有一個警告,如@ CY-4AH表示說:

自動合成財產不會合成財產協議

聲明

謝謝你們上面的意見。