Попробуйте вставить self.navigationItem.hidesBackButton = NO;
в метод init или в любое место перед вызовом pushViewController.
ViewDidLoad вызывается, когда вы впервые запрашиваете у контроллера представление, это означает, что оно, вероятно, вызывается из[self.navigationController pushViewController:c animated:YES]
.Но обратите внимание, что панель навигации не является частью вашего представления, она создается и обрабатывается UINavigationController
, поэтому в принципе она может существовать и рисоваться даже до вызова viewDidLoad и viewDidAppear.Если вы обновите там панель навигации, она фактически не будет перекрашена.
Редактировать 1: Пересматривается после прочтения документации для [UIViewController navigationItem]
Следует избегать связывания создания панеликнопки элементов в вашем элементе навигации для создания представления вашего контроллера представления.Элемент навигации контроллера представления может быть извлечен независимо от представления контроллера представления.Например, при перемещении двух контроллеров представления в стек навигации самый верхний контроллер представления становится видимым, но элемент навигации другого контроллера представления может быть извлечен для представления его кнопки «назад».Чтобы убедиться, что элемент навигации настроен, вы можете переопределить это свойство и добавить код для загрузки там элементов панели кнопок или загрузки элементов в код инициализации контроллера представления.
Редактировать 2: Повторно посещено после прочтениякомментарий, что мое решение не работает.Рабочий код (iOS 5, ARC):
//
// TestAppDelegate.m
// NavigationTest
//
// Created by Sulthan on 10/25/11.
// Copyright (c) 2011 StackOverflow. All rights reserved.
//
#import "TestAppDelegate.h"
@interface TestAppDelegate ()
@property (nonatomic, strong, readwrite) UINavigationController* navigationScreen;
@property (nonatomic, strong, readwrite) UIViewController* screen1;
@property (nonatomic, strong, readwrite) UIViewController* screen2;
@property (nonatomic, strong, readwrite) UIViewController* screen3;
@end
@implementation TestAppDelegate
@synthesize window = window_;
@synthesize navigationScreen = navigationScreen_;
@synthesize screen1 = screen1_;
@synthesize screen2 = screen2_;
@synthesize screen3 = screen3_;
- (UIViewController*)createTestScreenWithLabel:(NSString*)label {
CGRect bounds = [[UIScreen mainScreen] bounds];
UIViewController* screen = [[UIViewController alloc] init];
screen.view = [[UILabel alloc] initWithFrame:bounds];
screen.view.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
((UILabel*) screen.view).textAlignment = UITextAlignmentCenter;
((UILabel*) screen.view).text = label;
return screen;
}
- (void)pushThirdScreen {
if (!self.screen3) {
self.screen3 = [self createTestScreenWithLabel:@"Screen 3"];
self.screen3.navigationItem.hidesBackButton = NO;
}
[self.navigationScreen pushViewController:self.screen3 animated:YES];
}
- (void)pushSecondScreen {
self.screen2 = [self createTestScreenWithLabel:@"Screen 2"];
self.screen2.navigationItem.hidesBackButton = YES;
UIBarButtonItem* button = [[UIBarButtonItem alloc] initWithTitle:@"Go"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(pushThirdScreen)];
self.screen2.navigationItem.rightBarButtonItem = button;
[self.navigationScreen pushViewController:self.screen2 animated:YES];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
CGRect bounds = [[UIScreen mainScreen] bounds];
self.screen1 = [self createTestScreenWithLabel:@"Screen 1"];
self.navigationScreen = [[UINavigationController alloc] initWithRootViewController:self.screen1];
self.window = [[UIWindow alloc] initWithFrame:bounds];
self.window.backgroundColor = [UIColor whiteColor];
[self.window addSubview:self.navigationScreen.view];
[self.window makeKeyAndVisible];
[self performSelector:@selector(pushSecondScreen) withObject:nil afterDelay:3.0];
return YES;
}
@end
Редактировать 3: Пересмотрен после того, как вы заметили, что вы говорите в основном об iOS 4.2.В настоящее время я не могу проверить это на любой iOS 4.2, но я знаю о возможном обходном пути.Вы всегда можете скрыть панель навигации в вашем UINavigationController и просто разместить отдельную панель навигации на каждом экране.Вы будете иметь абсолютный контроль над ними, и вы даже можете редактировать их в Интерфейсном Разработчике.