我上课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:'
为什么呢?我在这里需要使用这些功能吗?我的实施是否正常?或者我该如何收到此通知?
我认为如果需要实现的话,可以在超类中创建明确的方法并在子类中覆盖它。这是最好的方式吗?
答案 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
}
希望这有帮助!