子类作为超类的委托
Subclass as delegate of superclass
我有classImageViewController
。它有代表:
@protocol ImageViewControllerDelegate
@optional
- (void)singleTapGestureRecognizer:(UITapGestureRecognizer *)gesture;
- (void)imageDidLoaded;
我还有 class AttachmentViewController
ImageViewController
的子class。在 class 中,我想获取事件,然后更改图像 属性。所以这是我的代码更改:
- (void)setImage:(UIImage *)image
{
// * Assign image with animation
[UIView transitionWithView:self.imageView
duration:k_DURATION_imageAppearence
options:UIViewAnimationOptionTransitionCrossDissolve
animations: ^{
self.imageView.alpha = 1;
} completion:^(BOOL finished) {
if ([self respondsToSelector:@selector(imageDidLoaded)]) {
[self.delegate imageDidLoaded];
}
}];
但是我不能用
if ([self.DELEGATE respondsToSelector:@selector(imageDidLoaded)])
然后我这样做我有错误:
No known instance method for selector 'respondsToSelector:'
为什么?我需要如何使用此功能?我的实现可以吗?或者我怎样才能得到这个通知?
我认为这里可以在 superclass 中创建清晰的方法,如果需要实现,则在 subclass 中覆盖它。这是最好的方法吗?
您应该将协议声明为 @protocol ImageViewControllerDelegate <NSObject>
这表示任何符合您的协议的对象也将符合 respondsToSelector:
在其中声明的 NSObject
协议。
这里确实没有足够的代码来理解你想要做什么。通常要设置委托,您的 class 上有一个代表委托的弱 属性,而 class 实例的父实例将设置委托。
这是一些伪代码:
@protocol SomeDelegateProtocol<NSObject>
- (void)someMethod:(id)someObject;
@end
@interface SomeClass:NSObject
@property (nonatomic, weak) id<SomeDelegateProtocol>delegate;
@end
@implementation SomeClass
- (void)someFunction {
if ([self.delegate respondsToSelector:@selector(someMethod:)]) {
// do code stuff
}
}
@end
///////////
@implementation SomeParentClass
- (void)someOtherFunction {
SomeClass *instance = [SomeClass new];
instance.delegate = self; // assuming self implements SomeDelegateProtocol, otherwise you get a warning
}
希望对您有所帮助!
我有classImageViewController
。它有代表:
@protocol ImageViewControllerDelegate
@optional
- (void)singleTapGestureRecognizer:(UITapGestureRecognizer *)gesture;
- (void)imageDidLoaded;
我还有 class AttachmentViewController
ImageViewController
的子class。在 class 中,我想获取事件,然后更改图像 属性。所以这是我的代码更改:
- (void)setImage:(UIImage *)image
{
// * Assign image with animation
[UIView transitionWithView:self.imageView
duration:k_DURATION_imageAppearence
options:UIViewAnimationOptionTransitionCrossDissolve
animations: ^{
self.imageView.alpha = 1;
} completion:^(BOOL finished) {
if ([self respondsToSelector:@selector(imageDidLoaded)]) {
[self.delegate imageDidLoaded];
}
}];
但是我不能用
if ([self.DELEGATE respondsToSelector:@selector(imageDidLoaded)])
然后我这样做我有错误:
No known instance method for selector 'respondsToSelector:'
为什么?我需要如何使用此功能?我的实现可以吗?或者我怎样才能得到这个通知?
我认为这里可以在 superclass 中创建清晰的方法,如果需要实现,则在 subclass 中覆盖它。这是最好的方法吗?
您应该将协议声明为 @protocol ImageViewControllerDelegate <NSObject>
这表示任何符合您的协议的对象也将符合 respondsToSelector:
在其中声明的 NSObject
协议。
这里确实没有足够的代码来理解你想要做什么。通常要设置委托,您的 class 上有一个代表委托的弱 属性,而 class 实例的父实例将设置委托。
这是一些伪代码:
@protocol SomeDelegateProtocol<NSObject>
- (void)someMethod:(id)someObject;
@end
@interface SomeClass:NSObject
@property (nonatomic, weak) id<SomeDelegateProtocol>delegate;
@end
@implementation SomeClass
- (void)someFunction {
if ([self.delegate respondsToSelector:@selector(someMethod:)]) {
// do code stuff
}
}
@end
///////////
@implementation SomeParentClass
- (void)someOtherFunction {
SomeClass *instance = [SomeClass new];
instance.delegate = self; // assuming self implements SomeDelegateProtocol, otherwise you get a warning
}
希望对您有所帮助!