Метод, реализованный из-за того, что делегат не сработал

#objective-c #cocoa-touch

#objective-c #cocoa-touch

Вопрос:

У меня есть UIViewController, который встроен в навигационный контроллер и представлен модально:

 //UIViewController
AuthenticationController *auth = [[AuthenticationController alloc] init];

//UINavigationController
AuthRootController *navController = [[AuthRootController alloc]
                                         initWithRootViewController:auth];

navController.navigationBar.topItem.title = @"Anmelden";
navController.delegate = self;

[self presentModalViewController:navController animated:YES];
RELEASE_SAFELY(navController);
  

Однако что-то не так с делегатом, который я создал в классе authootcontroller:

 @protocol AuthRootControllerDelegate

@required
-(void)authRootControllerDidEnd:(UINavigationController *)sender;

@end

@interface AuthRootController : UINavigationController {
    id<AuthRootControllerDelegate>  delegate;
}

@property (nonatomic, assign) IBOutlet id delegate;

@end
  

И реализация:

 @implementation AuthRootController
@synthesize delegate;

-(void)userDidCancelController:(UINavigationController *)sender{
    if (self.delegate amp;amp; [self.delegate conformsToProtocol:@protocol(AuthRootControllerDelegate)]) {
        [self.delegate authRootControllerDidEnd:sender];
    }
}

@end
  

Когда я использую метод

 -(void)authRootControllerDidEnd:(UINavigationController *)sender
  

он не срабатывает. Есть идеи?

Ответ №1:

Вы объявили, что ваш делегат соответствует authootcontrollerdelegate? Тест conformsToProtocol проверяет, объявляет ли делегат соответствие, он не выполняет никакой проверки методом за методом. Таким образом, даже если вы внедрили authootcontrollerdidend: в вашем делегате, conformsToProtocol все еще может возвращать NO .

Ответ №2:

В вашем интерфейсе вы не объявляете его как реализующий протокол делегирования, вам нужно изменить объявление вашего интерфейса следующим образом:

 @interface AuthRootController : UINavigationController<AuthRootControllerDelegate> {