2015-06-10 3 views
0

У меня есть класс 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

Сначала изучите класс и делегат одного из них, и вы сможете решить вашу проблему. Вам не хватает знаний о делетете –

+0

@nischalhada Это не имеет никакого отношения к синглонам или делегатам. См. Текущий ответ на проблему. – rmaddy

+0

если извините за неудобство –

ответ

4

Вы должны объявить протокол, как @protocol ImageViewControllerDelegate <NSObject>

Это говорит, что любой объект, который соответствует вашему протоколу будет также соответствовать NSObject протокола, который respondsToSelector: объявлен в.

+0

Точно как [определяется Apple] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithProtocols/WorkingwithProtocols.html) в качестве наилучшей практики. – Droppy

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 
} 

Надеется, что это помогает!

+0

Вам не хватает точки. Вопрос ясен, и речь идет о возникшей ошибке. См. Ответ «дан». – rmaddy

Смежные вопросы