如何在目标C中扩展委托的协议,然后将对象子类化以要求一致的委托

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
Run Code Online (Sandbox Code Playgroud)

执行:

#import "MySubClass.h"


@implementation MySubClass

- (void) SomeMethod; { 
    if ([self.delegate respondsToSelector: @selector (MySubClassMessage:)]) { 
        [self.delegate MySubClassMessage: self];
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

然而我得到了警告:'-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
Run Code Online (Sandbox Code Playgroud)

会产生警告: class 'MySubClassTester' does not implement the 'UITextViewDelegate' protocol

我想让它产生关于不实现'MySubClassDelegate'协议的警告.

moh*_*enr 25

UITextView其定义delegate

@property(nonatomic, assign) id<UITextViewDelegate> delegate
Run Code Online (Sandbox Code Playgroud)

意味着它符合UITextViewDelegate,这就是编译器检查的内容.如果要使用新协议,则需要重新定义delegate以符合您的协议:

@interface MySubClass : UITextView {
}
@property(nonatomic, assign) id<MySubClassDelegate> delegate   
@end
Run Code Online (Sandbox Code Playgroud)

编译器不应再提供任何警告.

[由fess更新]

...有了这个,编译器会警告需要实现访问器... [我实现了这个:]

-(void) setDelegate:(id<MySubClassDelegate>) delegate {
[super setDelegate: delegate];
}
- (id) delegate {
return [super delegate];
}
Run Code Online (Sandbox Code Playgroud)

"

[我的更新]

我相信如果你只是做一个@dynamic声明而不是重新实现该方法它应该工作,因为实现已经存在:

@dynamic delegate;
Run Code Online (Sandbox Code Playgroud)

  • 原来你不需要重新定义代表!看到这篇文章:http://stackoverflow.com/questions/732701/how-to-extend-protocols-delegates-in-objective-c (2认同)

Ric*_* P. 7

对于任何仍然感兴趣的人,这可以很简单地完成(为了示例,我将UIScrollView子类化):

@protocol MySubclassProtocol <UIScrollViewDelegate>
@required
-(void)myProtocolMethod;
@end

@interface MySubClass : UIScrollView

@property (nonatomic, weak) id <MySubclassProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)

这里最重要的细节是在你的协议名称之后的<>之间的部分,它以简单的方式表示你正在扩展该协议.在您的实现中,您需要做的就是:

@synthesize delegate;
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了.