尝试将self.navigationItem.hidesBackButton = NO;
放入init方法或在pushViewController调用之前的任何位置。
当您首次请求控制器的视图时,ViewDidLoad被调用,这意味着它可能是从[self.navigationController pushViewController:c animated:YES]
调用的。但请注意,导航栏不是您视图的一部分,它是由UINavigationController
创建和处理的,因此它可以存在并且在viewDidLoad和viewDidAppear被调用之前绘制。如果您在那里更新导航栏,则实际上不会重新绘制。
编辑1:阅读[UIViewController navigationItem]
文档后重新审视
您应该避免将导航项中的工具栏按钮项的创建与视图控制器的视图的创建相关联。可以独立于视图控制器的视图检索视图控制器的导航项。例如,在将两个视图控制器推送到导航堆栈上时,最顶层的视图控制器变为可见,但可以检索其他视图控制器的导航项以显示其返回按钮。为确保配置了导航项,可以重写此属性并添加代码以在其中加载工具栏按钮项,或者在视图控制器的初始化代码中加载这些项。
编辑2:在阅读评论后重新审视,发现我的解决方案无法工作。以下是可行的代码(iOS 5,ARC):
#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中隐藏导航栏,并在每个屏幕中放置单独的导航栏。您将对它们拥有绝对控制权,甚至可以在Interface Builder中编辑它们。
viewWillDisappear
方法中加入了self.navigationItem.hidesBackButton = NO
,但问题并未得到解决。 - JoJo