2014-09-04 108 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表示说:

自动合成财产不会合成财产协议

声明

谢谢你们上面的意见。