子类作为超类的委托

时间:2015-06-10 16:01:43

标签: ios objective-c inheritance uiviewcontroller delegates

我上课ImageViewController。它有代表:

@protocol ImageViewControllerDelegate
@optional
- (void)singleTapGestureRecognizer:(UITapGestureRecognizer *)gesture;
- (void)imageDidLoaded;

我还有AttachmentViewController的子类ImageViewController。在那个课程中,我希望获得事件,然后更改图像属性。所以这是我改变的代码:

- (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:'

为什么呢?我在这里需要使用这些功能吗?我的实施是否正常?或者我该如何收到此通知?

我认为如果需要实现的话,可以在超类中创建明确的方法并在子类中覆盖它。这是最好的方式吗?

2 个答案:

答案 0 :(得分:4)

您应将协议声明为@protocol ImageViewControllerDelegate <NSObject>

这表示符合您的协议的任何对象也将符合NSObject声明的respondsToSelector:协议。

答案 1 :(得分:0)

这里真的没有足够的代码来理解你正在尝试做什么。通常,要设置一个委托,您的类上有一个表示委托的弱属性,该类的实例的父级将设置委托。

这里有一些伪代码:

@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
}

希望这有帮助!