2011-12-14 2 views
1

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

Мое приложение не показывает ошибок, но когда я пытаюсь отлаживать или использовать операторы NSLog, это показывает, что приложение вообще не вводит эту функцию. У меня есть <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"); 
} 
+0

Не могли бы вы вставить код, в котором вы устанавливаете делегат 'navigationController'? – dasblinkenlight

+0

Возможно, это не способ записи, но это то, что я делаю: [self.navigationController setDelegate: self]; и в этом случае navigationController входит в функцию navigationController: willShowViewController: анимированный: но он не устанавливает мой rightBarButtonItem для любого представления. – Lily

+0

Убедитесь, что в этот момент ваш навигационный контроллер не ноль ... – Peres

ответ

4

Если вы хотите несколько представлений, чтобы иметь такую ​​же 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 

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

+0

Теперь все работает. Я унаследовал UITableViewController (@interface BaseViewController: UITableViewController), и теперь все работает плавно. Спасибо за помощь. – Lily

+0

Это хорошая идея, но проблема, которую я вижу, - это множественное наследование во всех представлениях. В каждом представлении я наследую либо NSObject, UITableViewController. Objective-C не поддерживается множественным наследованием. Или, если это так, и я ошибаюсь, как я могу сделать множественное наследование. – Lily

+0

Рад, что я мог помочь, пожалуйста, не забудьте отметить мой ответ как правильный :) – jerrylroberts

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