2014-02-16 2 views
0

У меня есть небольшая проблема с моим примером делегата. Я создал очень простой код, чтобы узнать, как работают делегаты. Я знаю, что мой делегат не будет вызван, но я не могу понять, почему? Итак, вот полный код. Пожалуйста, скажите мне, что я делаю неправильно. Для меня очень важно понять ошибку в этом коде.Делегат: нет ответа, где секрет?

Первый 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.

+1

Попробуйте установить NSLog внутри каждого viewDidLoad, чтобы убедиться, что порядок, в котором они вызывается. – Merlevede

+0

вам не следует сохранять этот делегат '@property (неатомный, сохранить) id delegate;' в противном случае он может упасть в цикле удержания. вы должны использовать назначение. – Pawan

ответ

0

Ваш текущий код в порядке. Проблема состоит в том, что вы никогда не загружаете представления (-ы) диспетчера представлений, поэтому метод viewDidLoad не вызывается.

Чтобы проверить, нажмите viewcontroller или просто запросите viewcontroller.view.

+0

Прежде всего, спасибо. Я рад любому ответу. Я изменил сохранение в назначении, но делегат все равно не сработает. Поэтому я также реализую NSLog в последней строке как ViewDidLoads. Я получаю вывод из обоих ViewDidLoads, поэтому эта часть в порядке. Я также могу видеть Представления после компиляции. По-моему, это должно сработать, но это не так. Единственное логическое решение состоит в том, что я забываю что-то важное, но что? – user1462808

+0

Я подозреваю, что вы используете раскадровку? Таким образом, просмотры, которые загружаются и просматриваются, не совпадают с теми, которые вы создаете, и устанавливаете себя как делегат ... Попробуйте нажать. – Wain

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