У меня есть небольшая проблема с моим примером делегата. Я создал очень простой код, чтобы узнать, как работают делегаты. Я знаю, что мой делегат не будет вызван, но я не могу понять, почему? Итак, вот полный код. Пожалуйста, скажите мне, что я делаю неправильно. Для меня очень важно понять ошибку в этом коде.Делегат: нет ответа, где секрет?
Первый ViewController: h.file
#import <UIKit/UIKit.h>
@protocol ViewControllerDelegate;
@interface ViewController : UIViewController
@property (nonatomic, retain) id<ViewControllerDelegate> delegate;
@end
@protocol ViewControllerDelegate <NSObject>
- (void)transfer:(ViewController *)data number:(NSUInteger)value;
@end
Первый ViewController: m.file
#import "ViewController.h"
@interface ViewController()
@end
@implementation ViewController
@synthesize delegate;
- (void)viewDidLoad
{
[super viewDidLoad];
if ([delegate respondsToSelector:@selector(transfer:number:)]){
[delegate transfer:self number:65];
NSLog(@"delegate called");
}
[delegate transfer:self number:65]; //Try to call without if-statement.
}
@end
SecondViewcontroller: h.file
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface SecondViewController : UIViewController <ViewControllerDelegate>
@end
SecondViewcontroller: m.file
#import "SecondViewController.h"
@interface SecondViewController()
@end
@implementation SecondViewController
- (void)transfer:(ViewController *)data number:(NSUInteger)value
{
NSLog(@"received information from ViewController");
}
- (void)viewDidLoad
{
[super viewDidLoad];
ViewController *viewcontroller = [[ViewController alloc] init];
viewcontroller.delegate = self;
}
@end
В раскадровке я использую два вида контейнера, чтобы отобразить оба ViewControllers.
Попробуйте установить NSLog внутри каждого viewDidLoad, чтобы убедиться, что порядок, в котором они вызывается. – Merlevede
вам не следует сохранять этот делегат '@property (неатомный, сохранить) id delegate;' в противном случае он может упасть в цикле удержания. вы должны использовать назначение. –
Pawan