在我的应用程序中,我有一个 UINavigationControllers 像这样初始化的 UITabBarController
UINavigationController *newsNavigationController = [[UINavigationController alloc] initWithRootViewController: newsViewControler];
newsViewController 是一个 UIViewController。当我按下标签栏中的按钮以显示带有 newsViewController 的导航项时,导航栏中的标题设置正常。在 newsViewController 中,我有一个在 init 之后调用的方法设置。在设置方法中,我像这样设置标题
[[self navigationItem] setTitle:[category_c title]];
现在问题来了,在我的 newsViewController 中,我有一个 tableView,当我触摸一个单元格时,我想推送一个带有所选新闻的 UIViewController,并在导航栏中显示标题。
在 UIViewController 中,我有相同的设置方法,可以像上面那样设置标题。问题是没有显示。导航项不为空,因为我可以调用self.navigationItem.hidesBackButton = YES;
并且它每次都隐藏后退按钮但不显示标题。
当触摸单元格时,我像这样创建并推送新闻 UIViewController
if(newsViewController == nil){
newsViewController = [[NewsViewController alloc] init];
[newsViewController setup];
}
[self.navigationController pushViewController: newsViewController animated:YES];
newsViewController 中的 setup 方法如下所示:
- (void) setup {
self.navigationItem.hidesBackButton = YES;
[self.navigationItem setTitle:@"my view"];
}
在 newsViewController 我有 viewDidLoad 并试图在那里设置标题但没有成功。
- (void)viewDidLoad { self.navigationItem.title = @"Test"; [超级视图DidLoad]; }
如果在[self.navigationController pushViewController: newsViewController animated:YES];
我编写[[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"];
了包含 UITableView 的 UIViewController 之后,得到的标题是 myTitle 而不是我在触摸单元格时推送的 newsViewController。
任何指针?我不明白为什么标题设置不正确。
EDIT2:在阅读了更多内容并使用调试器逐步浏览我的代码并将rootviewcontrollers与childViewControllers进行比较之后,我观察到在设置self.title = @“title”后childViewController的viewDidLoad方法中,navigationItem是创建所以这不是零的情况。在调试器中,当我展开 _navigationItem 变量时,字段 _navigationBar 在离开 viewDidLoad 后为零,在 rootViewControllers 中,navigationBar 不是 NULL 并且标题在那里。我读到,如果 navigationBar 为 null,标题将不会显示。在图像中是我在调试器中看到的。alt text http://img138.imageshack.us/img138/1513/picture2bq.png现在我正在朝这个方向搜索。
EDIT1:下面是 parentViewController、firstChildViewController 和第二个 ChildViewController 的代码。parentViewController 被查看(标题没问题)。我在导航栏上按下一个按钮,调用 BearbeitenAction -> 第一个孩子被推(不显示标题)。在 firstChildViewController 的导航栏上,我有一个按钮,按下该按钮会在堆栈上推送一个新的 ViewController(secondChildViewController)。第二个 ChildViewController 的标题不行。当我按下 Back 时,firstChildViewController 的标题显示为 Ok。
父视图控制器:
//MARK: -
//MARK: Initialization methods
- (void) setup {
dataManipulator = [[DataManipulation alloc] init];
dataManipulator.delegate = self;
[self.tabBarItem initWithTitle:[NSString stringWithFormat:@"%@",[category_c title]] image:[UIImage newImageFromResource:[category_c icon]] tag:0];
searchResults = nil;
companyDetailsPushed = NO;
}
//MARK: -
//MARK: ViewControllerMethods
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void) loadView {
NSLog(@"WatchlistViewController: loadView");
UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease];
[mainView setBackgroundColor:[UIColor whiteColor]];
mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
mainView.contentMode = UIViewContentModeScaleToFill;
[mainView setAutoresizesSubviews:YES];
companiesTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 44, [[UIScreen mainScreen] applicationFrame].size.width, 322)];
companiesTable.delegate = self;
companiesTable.dataSource = self;
[mainView addSubview:companiesTable];
[companiesTable release];
self.view = mainView;
}
- (void)viewDidLoad {
[super viewDidLoad];
if(![[category_c subtitle] isEqualToString:@""]) {
self.title = [category_c subtitle];
}
else {
self.title = [category_c title];
}
}
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if(companyDetailsViewController == nil) {
companyDetailsViewController = [[CompanyDetailsScrollViewController alloc] init];
[companyDetailsViewController setup];
}
[watchlistDoneBtn setHidden:TRUE];
companyDetailsPushed = YES;
if(viewMode == SearchViewMode)
[companyDetailsViewController setCompany:[searchResults objectAtIndex:indexPath.row]];
else if(viewMode == WatchlistViewMode)
[companyDetailsViewController setCompany:[[[Financial_deAppDelegate sharedAppDelegate] watchlistCompanies] objectAtIndex:indexPath.row]];
[[self navigationController] pushViewController:companyDetailsViewController animated:YES];
}
- (void) bearbeitenAction:(UIButton *) sender {
NSLog(@"Berbeiten btn was pressed");
if(berbeitenViewController == nil){
berbeitenViewController = [[BerbeitenViewController alloc] init];
[berbeitenViewController setup];
}
[self.navigationController pushViewController:berbeitenViewController animated:YES];
}
代码中的 firstChildViewController = berbeitenViewController:
- (void) setup {
self.navigationItem.hidesBackButton = YES;
}
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
NSLog(@"BerbeitenViewController: loadView");
UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease];
[mainView setBackgroundColor:[UIColor darkGrayColor]];
mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
mainView.contentMode = UIViewContentModeScaleToFill;
[mainView setAutoresizesSubviews:YES];
berbeitenBackBtn = [[UIButton alloc] initWithFrame:CGRectMake(5, 23, 69, 36)];
[berbeitenBackBtn setBackgroundImage:[UIImage newImageFromResource:@"back_btn.png"] forState:UIControlStateNormal];
[berbeitenBackBtn addTarget:self action:@selector(popViewController:) forControlEvents:UIControlEventTouchUpInside];
[berbeitenBackBtn setEnabled:TRUE];
[self.navigationController.view addSubview:berbeitenBackBtn];
[berbeitenBackBtn release];
berbeitenAddBtn = [[UIButton alloc] initWithFrame:CGRectMake(260, 23, 55, 36)];
[berbeitenAddBtn setBackgroundImage:[UIImage newImageFromResource:@"bearbeiten_add_btn.png"] forState:UIControlStateNormal];
[berbeitenAddBtn addTarget:self action:@selector(addCompany:) forControlEvents:UIControlEventTouchUpInside];
[berbeitenAddBtn setEnabled:TRUE];
[self.navigationController.view addSubview:berbeitenAddBtn];
[berbeitenAddBtn release];
companiesTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, 366)];
companiesTable.delegate = self;
companiesTable.dataSource = self;
[mainView addSubview:companiesTable];
[companiesTable release];
self.view = mainView;
}
- (void)viewDidLoad {
NSLog(@"BerbeitenViewController viewDidLoad");
[super viewDidLoad];
self.title = @"Edit watchlist";
}
//MARK: Buttons actions
- (void) popViewController:(UIButton *) sender {
NSLog(@"Pop BerbeitenViewController");
[self.navigationController popViewControllerAnimated:YES];
}
- (void) addCompany:(UIButton *) sender {
NSLog(@"Berbeiten addCompany btn pushed");
if(searchViewController == nil){
searchViewController = [[SearchViewController alloc] init];
[searchViewController setup];
}
[self.navigationController pushViewController:searchViewController animated:YES];
}
代码中的 secondChildViewController = searchViewController
- (void) setup {
self.navigationItem.hidesBackButton = YES;
}
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
NSLog(@"BerbeitenViewController: loadView");
UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease];
[mainView setBackgroundColor:[UIColor darkGrayColor]];
mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
mainView.contentMode = UIViewContentModeScaleToFill;
[mainView setAutoresizesSubviews:YES];
searchViewBackBtn = [[UIButton alloc] initWithFrame:CGRectMake(5, 23, 69, 36)];
[searchViewBackBtn setBackgroundImage:[UIImage newImageFromResource:@"back_btn.png"] forState:UIControlStateNormal];
[searchViewBackBtn addTarget:self action:@selector(popViewController:) forControlEvents:UIControlEventTouchUpInside];
[searchViewBackBtn setEnabled:TRUE];
[self.navigationController.view addSubview:searchViewBackBtn];
[searchViewBackBtn release];
self.view = mainView;
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Edit Watchlist";
}