iOS-протоколы и делегаты на примере - PullRequest
3 голосов
/ 01 августа 2011

Хорошо, я искал, но не было никакого метода, который работал бы для меня. Следующий код основан на многих руководствах и документации Apple, но я не могу заставить его работать. Кто-нибудь может помочь, пожалуйста?

Код сбоя: obj.delegatee = self; (в классе B.h), также методы RespondsToSelector и executeSelector: withObject не распознаются.

Я хочу установить объект делегата, для которого будет вызываться метод, когда мы нажимаем на конкретное изображение.

класс А.ч .:

@interface AViewController : UIViewController <UIScrollViewDelegate>{
    id delegatee;
}
@property (nonatomic, assign) id <AViewControllerDelegate> delegatee;
@end

@protocol AViewControllerDelegate
@optional
- (void) tappedImage:(int)tag;
@end

класс А.м .:

@dynamic delegatee;
- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
UIImageView *imageView = (UIImageView *)[gestureRecognizer view];
int a = imageView.tag;

if ([self.delegatee respondsToSelector:@selector(tappedImage:)])
    [self.delegatee performSelector:@selector(tappedImage:) withObject: [NSNumber numberWithInt:a]];

}

класс B.h:

#import "AViewController.h"
@interface BViewController : UIViewController <AViewControllerDelegate> {...}

класс Б.м .:

- (void)viewDidLoad
{
[super viewDidLoad];
//... some code

AViewController *obj = [[[AViewController alloc] init] autorelease];
obj.delegatee = self;
}

- (void) tappedImage:(int)tag{
UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed: [NSString stringWithFormat: @"%d.png",tag]]];
CViewController *NView = [[CViewController alloc] initWithPicture: imgView.image];
[self presentModalViewController:NView animated:YES];
[NView release]; NView = nil;
}

Большое спасибо за любую помощь, я надеюсь, что это поможет мне понять, как работают протоколы.

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Две вещи.

  1. (Ваш сбой) Вы объявили delegatee как @dynamic вместо @synthesized, что означает, что вы несете ответственность за создание -(void)setDelegatee:(id<AViewControllerDelegate>) (и получателя)) метод.Исправление: просто измените его с @dynamic на @synthesize delegatee;

  2. (Ваши предупреждения) Если вы хотите вызывать методы, которые вы явно не определяете в своем протоколе, тогда ваш протокол будет нуждаться всоответствовать другому протоколу :).Исправление: добавьте протокол NSObject к своему объявлению.

@protocol AViewControllerDelegate<NSObject>

0 голосов
/ 02 августа 2011

У меня сложилось впечатление, что использование @dynamic delegatee требует от вас реализации -(id)delegatee и (void)setDelegatee:(id)delegatee.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...