Проблема с NavigationController

#iphone #uinavigationcontroller

#iPhone #uinavigationcontroller

Вопрос:

У меня следующее:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath(NSIndexPath*)indexPath
{

     audiChassisInputViewController = [[myAudiChassisInputViewController alloc] init];    

    [self.navigationController pushViewController:audiChassisInputViewController animated:YES];

    self.navigationController.navigationBarHidden = NO;

    UIBarButtonItem *retourButton = [[UIBarButtonItem alloc] initWithTitle:@"Retour" style:UIBarButtonItemStyleBordered target:self.navigationController action:@selector(popViewControllerAnimated:)]; 
    [self.navigationController.navigationBar.topItem setLeftBarButtonItem:retourButton];
    [self.navigationController.navigationBar.topItem setTitle:@"Chassis Input"];
    [retourButton release];

    [audiChassisInputViewController release];

}
  

и это работает…отображается новое представление.

в новом представлении:

myAudiChassisInputViewController.h

 - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    chassisInputTextView.layer.cornerRadius = 15;
    chassisInputTextView.clipsToBounds = YES;
    [chassisInputTextView becomeFirstResponder];

    UIBarButtonItem *okButton = [[UIBarButtonItem alloc] initWithTitle:@"OK" style:UIBarButtonItemStyleBordered target:self action:@selector(chassisOkPressed)];  
    [self.navigationController.navigationBar.topItem setRightBarButtonItem:okButton];
    [okButton release];

}
  

У меня нет ошибки, но кнопка правой панели не отображается.Кто-нибудь, есть идеи, почему?

Ответ №1:

Измените эту строку:

 [self.navigationController.navigationBar.topItem setRightBarButtonItem:okButton];
  

с помощью этой строки:

 [[self navigationItem] setRightBarButtonItem:okButton];
  

Дело в том, что к моменту viewDidLoad выполнения верхний элемент панели навигации ( self.navigationController.navigationBar.topItem ) все еще указывает на элемент навигации контроллера заднего вида.

Контроллер заднего вида — это тот, который раньше был контроллером верхнего вида до того, как текущий контроллер верхнего вида был помещен в стек ( [[viewControllers objectAtIndex:[viewControllers count] - 2] navigationItem] ). Следующий фрагмент показывает, как верхний элемент панели навигации по-прежнему указывает на элемент навигации контроллера заднего вида viewDidLoad , и он предназначен только для иллюстрации:

 // the view controllers currently on the navigation stack
NSArray *viewControllers = self.navigationController.viewControllers;
// The root view controller is at index 0 in the array, the back view controller is at index n-2, and the top controller is at index n-1, where n is the number of items in the array.
UIViewController *backViewController = [viewControllers objectAtIndex:[viewControllers count] - 2];
// get the navigation item of the back view controller
UINavigationItem *backNavigationItem = backViewController.navigationItem;
UINavigationItem *topItem = self.navigationController.navigationBar.topItem;
if  (backNavigationItem == topItem) {
    NSLog(@"This gets logged to the console");
}
  

Комментарии:

1. это работает… но все же я не понимаю вашего объяснения … не могли бы вы отредактировать свой ответ для меня? Спасибо

Ответ №2:

Перейдите к своему

Файл myAudiChassisInputViewController.m

разместите следующий код

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

    UIBarButtonItem *retourButton = [[UIBarButtonItem alloc] initWithTitle:@"Retour" style:UIBarButtonItemStyleBordered target:self.navigationController action:@selector(popViewControllerAnimated:)];

    UIBarButtonItem *itemOkey=[[UIBarButtonItem alloc] initWithTitle:@"OK" style:UIBarButtonItemStyleBordered target:self action:@selector(chassisOkPressed)];

    self.navigationItem.rightBarButtonItem=itemOkey;
    self.navigationItem.leftBarButtonItem=retourButton;
}
  

У меня есть допустимый вывод следующим образом, который вы хотите иметь введите описание изображения здесь

Надеюсь, это поможет вам.

Ответ №3:

Если у вас есть файл xib вашего класса, добавьте контроллер навигации и добавьте панель навигации, а под ней добавьте UIBarButton.