Метод делегата не вызывается (равен нулю)
У меня есть файл.xib с UIView
, UIView
содержит некоторые элементы и распознаватель жестов касания.
Это связано с AnnotationView
с розетками. В AnnotationView
Я ловлю события крана, и он работает нормально.
Затем я пытаюсь передать это событие в родительский вид (ViewController
), где AnnotationView
Экземпляр был создан и добавлен как подпредставление. Но мой метод делегата не вызывается. Я не знаю, как решить эту проблему, и я не знаю, так ли это, потому что я использую подпредставление или я просто делаю что-то не так с делегатом.
Вот некоторый код:
AnnotationView.h
#import <UIKit/UIKit.h>
@protocol protName <NSObject>
-(void) test;
@end
@interface AnnotationView : UIView
@property (strong, nonatomic) IBOutlet UIImageView *image;
@property (weak, nonatomic) IBOutlet UILabel *textLabel;
@property (weak, nonatomic) IBOutlet UILabel *accessoryLabel;
@property (strong, nonatomic) IBOutlet UITapGestureRecognizer *tapRecognizer;
@property (nonatomic, weak) id <protName> delegate;
-(IBAction)handleTap:(UITapGestureRecognizer *)tapRecognizer;
@end
AnnotationView.m
#import "AnnotationView.h"
@implementation AnnotationView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"AnnotationView"
owner:self
options:nil];
AnnotationView *_myView = [nibContents objectAtIndex:0];
_myView.backgroundColor = [UIColor greenColor];
[self addSubview: _myView];
}
return self;
}
-(IBAction)handleTap:(UITapGestureRecognizer *)tapRecognizer{
NSLog(@"tap tap");
[self.delegate test]; //this delegate is nil
}
@end
ViewController.h
#import <UIKit/UIKit.h>
#import "AnnotationView.h"
@interface ViewController : UIViewController <protName>
@property (nonatomic,retain) AnnotationView *annot;
-(void) test;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
_annot = [[AnnotationView alloc] initWithFrame:CGRectMake(100, 100, 212, 45)];
_annot.textLabel.text = @"some text";
_annot.delegate = self;
[self.view addSubview:_annot];
}
-(void) viewWillAppear:(BOOL)animated{
_annot.delegate = self;
}
-(void) test{
NSLog(@"Delegate massage is received!");
}
@end
3 ответа
Почему бы просто не сделать это:
@implementation ViewController
- (void)viewDidLoad
{
CGRect frame = CGRectMake(100, 100, 212, 45)];
NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"AnnotationView"
owner:nil
options:nil];
for (id object in nibContents) {
if ([object isKindOfClass:[AnnotationView class]]) {
_annot = (AnnotationView *)object;
}
}
_annot.frame = frame;
_annot.backgroundColor = [UIColor greenColor];
_annot.textLabel.text = @"some text";
_annot.delegate = self;
[self.view addSubview:_annot];
}
Как правильно использовать делегат!
В SecondViewController.h:
@protocol messageDelegate <NSObject>
@optional
-(void) test;
@end
@interface SecondViewController : NSString
@property (nonatomic, assign) id <messageDelegate> delegate;
@end
В SecondViewController.m:
-(void)readyToSend
{
[self.delegate test];
}
В ViewController.h:
@interface ViewController : UIViewController<messageDelegate>
@end
В ViewController.m: в
- (void)viewDidLoad {
SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.delegate = self;
}
-(void) test{
NSLog(@"Delegate massage is received!");
}
Надеюсь, это поможет!
Это ваш viewController, а не AnnotationView, который реализует протокол. Таким образом, вы можете переместить это, чтобы дать:
@interface AnnotationView : UIView <protName>