в моем приложении у меня есть UITabBarController с UINavigationControllers инициализированы как этотNavigationItem SETTITLE не работает на втором уровне UIViewController
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 выглядит следующим образом:
- (void) setup {
self.navigationItem.hidesBackButton = YES;
[self.navigationItem setTitle:@"my view"];
}
в newsViewController я есть viewDidLoad и попытался чтобы установить заголовок там, но без успеха.
- (пустоты) viewDidLoad { self.navigationItem.title = @ "Тест"; [super viewDidLoad]; }
если после [self.navigationController pushViewController: newsViewController animated:YES];
я пишу [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"];
UIViewController, который содержит UITableView получает название myTitle вместо этого newsViewController, что я толкнул, когда я прикоснулся к ячейке.
любые указатели? Я не понимаю, почему заголовок установлен неправильно.
EDIT2: После прочтения немного больше и собирается через мой код с шагом отладчика за шагом и сравнение rootviewcontrollers с childViewControllers я заметил, что в методе viewDidLoad в childViewController после установки self.title = @» title ", создается элемент navigationItem, поэтому это не нулевая ситуация. В отладчике, когда я расширяю переменную _navigationItem, поле _navigationBar равно нулю после выхода из viewDidLoad, в rootViewControllers navigationBar NOT NULL, и заголовок есть. Я читал, что если navigationBar имеет значение null, заголовок не будет отображаться. На изображении это то, что я видел в отладчике. alt text http://img138.imageshack.us/img138/1513/picture2bq.png сейчас я ищу в этом направлении.
EDIT1: ниже приведен код parentViewController, firstChildViewController и второго ChildViewController. Просмотр parentViewController (заголовок в порядке). Я нажимаю кнопку на навигационной панели, которая вызывает bearbeitenAction -> первый ребенок нажат (заголовок не отображается). На панели навигации firstChildViewController у меня есть кнопка, которая при нажатии нажимает новый ViewController в стеке (secondChildViewController). Заголовок второго ChildViewController не подходит. Когда я нажимаю Назад, заголовок firstChildViewController отображается ОК.
parentViewController:
//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";
}
Отличное объяснение ... tl; др; – luvieere
Я возьму это как комплимент :) –