子类作为超类的委托

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
}

希望对您有所帮助!