Не входит в функцию -navigationController: willShowViewController: animated: - PullRequest
1 голос
/ 14 декабря 2011

Я боролся с этой проблемой уже несколько дней.Я пытался иметь постоянный RightBarButtonItem в нескольких представлениях.Изучив несколько блогов и поисков в Интернете, оказалось, что мне нужно установить rightBarButtonItem в функции -navigationController:willShowViewController:animated:.

. В моем приложении не отображаются ошибки, но при попытке отладки или использования1006 * операторов, это показывает, что приложение вообще не входит в эту функцию.У меня <UINavigationControllerDelegate> в интерфейсе моего RootViewController класса, но я также установил свой NSXMLParser парсер как делегат себе ([parser setDelegate:self];) в другом классе.Может ли это быть причиной того, что делегат navigationController не распознан или что-то в этом роде.

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{
     //[self.navigationController.navigationItem setRightBarButtonItem:twoButtons animated:YES];
     self.navigationItem.rightBarButtonItem = twoButtons;

     NSLog(@"We are in navigationController delegate function");
}

1 Ответ

4 голосов
/ 14 декабря 2011

Если вы хотите, чтобы несколько представлений имели один и тот же rightBarButtonItem, почему бы не создать базовый UIViewController, который наследуют все ваши представления?Концептуально, я думаю, что это лучшее решение, потому что не только все представления унаследуют кнопку, они также получат поведение;) Это также позволяет вам переопределять методы в вашем базовом контроллере только в том случае, если нужно одно представлениеобрабатывать щелчок немного по-другому.

@interface BaseViewController : UIViewController

@property (nonatomic, retain) YourApplicationDelegate *delegate;

- (void) setupButtons;

- (void) buttonClicked:(id)sender;

@end

#import "BaseViewController.h"

@implementation BaseViewController

@synthesize delegate=_delegate;

- (void) viewDidLoad {

    [super viewDidLoad];

    self.delegate = (YourApplicationDelegate *) [[UIApplication sharedApplication] delegate];

    [self setupButtons];
}

- (void) setupButtons {
    UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave 
                                                                        target:self 
                                                                        action:@selector(buttonClicked:)];

    self.navigationItem.rightBarButtonItem = button;

    [button release];    
}

- (void) buttonClicked:(id)sender {
    NSLog(@"Click!");
}

- (void) dealloc {
    [_delegate release];
    [super dealloc];
}

@end

/* Now the rest of your view controllers look pretty clean and you don't have a lot of
   code in your delegate method.  Most problems can be solved with a layer or two of abstraction :)  */

@interface MyViewController : BaseViewController

@end

Базовые ViewControllers также являются хорошим местом для внедрения вашего делегата приложения, который вам понадобится много.Вот почему я включил его в блок кода, хотя это не было частью вашего вопроса.Если вы хотите использовать общий экземпляр кнопки или делегировать обработчик ответа, вы можете легко поместить этот код в свой делегат и использовать базовое представление для легкого доступа к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...