fes*_*s . 31 iphone delegates objective-c
我想继承UITextView,并向委托发送一条新消息.所以,我想扩展委托协议.这样做的正确方法是什么?
我从这开始:
接口:
#import <Foundation/Foundation.h>
@class MySubClass;
@protocol MySubClassDelegate <UITextViewDelegate>
- (void) MySubClassMessage: (MySubClass *) subclass;
@end
@interface MySubClass : UITextView {
}
@end
执行:
#import "MySubClass.h"
@implementation MySubClass
- (void) SomeMethod; { 
    if ([self.delegate respondsToSelector: @selector (MySubClassMessage:)]) { 
        [self.delegate MySubClassMessage: self];
    }
}
@end
然而我得到了警告:'-MySubClassMessage:' not found in protocol(s).
我有一种工作方式,我创建自己的ivar来存储委托,然后也使用[super setDelegate]  但是这似乎是错误的存储委托.也许不是.
我知道我可以直接传递id,但我的目标是确保编译器检查提供给MySubClass的任何委托是否符合MySubClassDelegate协议.
为了进一步克服:
@interface MySubClassTester : NSObject {
}
@implementation MySubClassTester
- (void) one { 
    MySubClass *subclass = [[MySubClass alloc] init];
    subclass.delegate = self;
}
@end
会产生警告: class 'MySubClassTester' does not implement the 'UITextViewDelegate' protocol
我想让它产生关于不实现'MySubClassDelegate'协议的警告.
moh*_*enr 25
将UITextView其定义delegate为
@property(nonatomic, assign) id<UITextViewDelegate> delegate
意味着它符合UITextViewDelegate,这就是编译器检查的内容.如果要使用新协议,则需要重新定义delegate以符合您的协议:
@interface MySubClass : UITextView {
}
@property(nonatomic, assign) id<MySubClassDelegate> delegate   
@end
编译器不应再提供任何警告.
[由fess更新]
...有了这个,编译器会警告需要实现访问器... [我实现了这个:]
-(void) setDelegate:(id<MySubClassDelegate>) delegate {
[super setDelegate: delegate];
}
- (id) delegate {
return [super delegate];
}
"
[我的更新]
我相信如果你只是做一个@dynamic声明而不是重新实现该方法它应该工作,因为实现已经存在:
@dynamic delegate;
对于任何仍然感兴趣的人,这可以很简单地完成(为了示例,我将UIScrollView子类化):
@protocol MySubclassProtocol <UIScrollViewDelegate>
@required
-(void)myProtocolMethod;
@end
@interface MySubClass : UIScrollView
@property (nonatomic, weak) id <MySubclassProtocol> delegate;
这里最重要的细节是在你的协议名称之后的<>之间的部分,它以简单的方式表示你正在扩展该协议.在您的实现中,您需要做的就是:
@synthesize delegate;
而且你已经完成了.
| 归档时间: | 
 | 
| 查看次数: | 15407 次 | 
| 最近记录: |