Проблема с делегатом и NavigationController - PullRequest
3 голосов
/ 03 февраля 2011

Я использую NavigationController для «выталкивания» viewControllers из корневого представления приложения.

Я хочу использовать делегатов для связи текущего загруженного представления и rootViewController. Я смог сделать это с помощью NSNotificationCenter, но хочу попробовать делегатов для этой конкретной ситуации, так как общение всегда будет один на один.

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

#import <UIKit/UIKit.h>

@protocol AnotherViewControllerDelegate;

@interface AnotherViewController : UIViewController {
    id <AnotherViewControllerDelegate> delegate;
}

- (IBAction) doAction;

@property (nonatomic, assign) id delegate;

@end


@protocol AnotherViewControllerDelegate <NSObject>
- (void) doDelegatedAction:(AnotherViewController *)controller;
@end

DoAction IBAction подключено к кнопке UIB в представлении. В моем файле реализации я добавил:

#import "AnotherViewController.h"    
@implementation AnotherViewController

@synthesize delegate;

- (IBAction) doAction {
    NSLog(@"doAction");
    [self.delegate doDelegatedAction:self];
}

В моем RootViewController.h я добавил AnotherViewControllerDelegate к объявлению интерфейса:

@interface RootViewController : UIViewController <AnotherViewControllerDelegate> {...

и это к моему файлу реализации

- (void) doDelegatedAction:(AnotherViewController *)controller {
    NSLog(@"rootviewcontroller->doDelegatedAction");
 }

К сожалению, это не работает. doDelegatedAction в rootViewController не вызывается. Я подозреваю, что это из-за того, как я толкаю AnotherViewController:

    AnotherViewController *detailViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil];
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];

Должен ли я каким-либо образом сообщить AnotherViewController, что его делегатом будет RootViewController именно в тот момент, когда он будет выдвинут? или я что-то упускаю?

1 Ответ

1 голос
/ 03 февраля 2011

Вам необходимо установить delegate из AnotherViewController на rootViewController, чтобы все было правильно подключено.

Если вы инициализируете AnotherViewController в вашем rootViewController, это будет:

AnotherViewController *detailViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil];
detailViewController.delegate = self;
[self.navigationController pushViewController:detailViewController animated:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...