2015-09-15 3 views
0

Я новичок в IOS, и я работал с делегатами для вызова метода в родительском ViewController.Метод делегатов, который никогда не называется

ViewControllerRegistration.h

@protocol RegistrationViewControllerDelegate; 
@interface ViewControllerRegistration : UIViewController 
@property (nonatomic, weak) id<RegistrationViewControllerDelegate> delegate; 
- (IBAction)registerNewUser:(id)sender; 
@end 

// 3. Definition of the delegate's interface 
@protocol RegistrationViewControllerDelegate <NSObject> 
-(void)loginResult:(NSString*)loginData; 
@end 

ViewControllerRegistration.m

- (void)registerNewUser:(id)sender { 
id<RegistrationViewControllerDelegate> strongDelegate = self.delegate; 

    // Our delegate method is optional, so we should 
    // check that the delegate implements it 
    if ([strongDelegate respondsToSelector:@selector(loginResult:)]) { 
     [strongDelegate loginResult: @"@WHY YOU NOT BEING CALLED?"]; 
    } 

Родители:

ViewController.h

#import "ViewControllerRegistration.h" 

@interface ViewController : UIViewController <GPPSignInDelegate,FBSDKLoginButtonDelegate,RegistrationViewControllerDelegate> 
@end 

ViewController.m

@implementation ViewController 
@synthesize signInButton; 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

ViewControllerRegistration *detailViewController = [[ViewControllerRegistration alloc] init]; 
    // Assign self as the delegate for the child view controller 
    detailViewController.delegate = self; 
} 
//Local Strategy 
- (IBAction)navigateToLocalSignUpNavBtn:(id)sender { 
    [self performSegueWithIdentifier:@"SegueRegisterUserAction" sender:self]; 
} 

// Implement the delegate methods for RegistrationViewControllerDelegate 
-(void)loginResult:(NSString*)loginData{ 
    NSLog(@"I am called"); 
    //^Above is never printed. That means delegate method is never called 
} 

Пожалуйста, обратите внимание, что мой родитель-контроллер встроен в контроллер навигации.

Метод делегата никогда не вызывается. Пробовал отлаживать, но напрасно.

+0

Проблема заключается в том, что создаваемый вами 'detailViewController' - это не то же самое, что вы получите после' performSegueWithIdentifier'. Итак, для текущего видимого делегата 'ViewControllerRegistration' будет nil. Попытайтесь использовать '- prepareForSegue: sender:' и получите 'destinationController', чтобы установить свойство делегирования. –

ответ

1

Контроллер вида, который вы создаете в viewDidLoad, отличается от того, с которым вы будете переходить. Это другой экземпляр, который будет освобожден в конце метода. Вам нужно получить доступ к правильному экземпляру в prepareForSegue и установить там делегат.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"SegueRegistrationUserAction"]) { 
     [(ViewControllerRegistration *)segue.destinationViewController setDelegate:self]; 
    } 
} 
+0

Бинго. :) Пятно на, парень !!! Провел несколько сумасшедших часов, копался. Я знал, что есть проблема со ссылками, и это может быть освобождено. Мысль, объявляющая @strong ссылки, сделает трюк, это не так. Знай мою ошибку. –

1

Вчера я объяснил это подробно на this thread. Пожалуйста, взгляните и дайте мне знать, если у вас есть какой-то конкретный вопрос. Надеюсь, это поможет вам.

+0

Спасибо. Очень ценю. Прошел через почту и действительно не нашел различий. Я следовал той же схеме. Просто изменил часть, в которой мне нужно уделить сильную ссылку на ViewControllerRegistration. '@property (неатомный, сильный) ViewControllerRegistration * settingsVC; self.settingsVC = [[ViewControllerRegistration alloc] init]; // Назначить себя как делегата для дочернего контроллера self.settingsVC.delegate = self; ' Но напрасно. :( –

+0

Не могли бы вы поставить точку останова в свой метод 'registerNewUser:' и сказать мне, что такое значение 'self.delegate' – Abhinav

+0

Кроме того, поскольку вы используете панель рассказов, я считаю, что вы устанавливаете делегат на правильную' ViewControllerRegistration', объект. Можете ли вы, пожалуйста, дважды проверить это. – Abhinav

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