NavigationItem setTitle ne fonctionne pas pour le deuxième niveau de UIViewController
dans mon application j'ai un UITabBarController avec UINavigationControllers initialisé comme ce
UINavigationController *newsNavigationController = [[UINavigationController alloc] initWithRootViewController: newsViewControler];
newsViewController est un UIViewController.
Lorsque j'appuie sur le bouton dans la tabbar pour afficher l'élément de navigation avec la newsViewController le titre dans la barre de navigation est définie sur ok. dans le newsViewController j'ai une configuration de la méthode que j'appelle après init. Dans la méthode de configuration j'ai mis le titre comme ceci
[[self navigationItem] setTitle:[category_c title]];
Le problème vient maintenant, dans mon newsViewController j'ai un tableView, quand je touche une cellule, je veux pousser un UIViewController avec les nouvelles sélectionnées et dans la barre de navigation pour afficher le titre.
Dans le UIViewController j'ai la même méthode de configuration dans lequel j'ai installé le titre comme ci-dessus. Le problème est que n'est pas montré. L'élément de navigation n'est pas nulle parce que je peux appeler self.navigationItem.hidesBackButton = YES;
et il cache le bouton retour à chaque fois mais le titre n'est pas indiqué.
- Je créer et pousser les nouvelles UIViewController de ce genre quand une cellule est touchée
if(newsViewController == nil){
newsViewController = [[NewsViewController alloc] init];
[newsViewController setup];
}
[self.navigationController pushViewController: newsViewController animated:YES];
La méthode de configuration dans le newsViewController ressemble à ceci:
- (void) setup {
self.navigationItem.hidesBackButton = YES;
[self.navigationItem setTitle:@"my view"];
}
dans le newsViewController j'ai viewDidLoad et essayé de définir le titre, mais sans succès.
- (void)viewDidLoad {
auto.navigationItem.title = @"Test";
[super viewDidLoad];
}
si après [self.navigationController pushViewController: newsViewController animated:YES];
j'écris [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"];
la UIViewController qui contient la UITableView obtient le titre myTitle au lieu de la newsViewController que j'ai poussé quand j'ai touché la cellule.
les pointeurs? je ne comprends pas pourquoi le titre n'est pas réglé correctement.
EDIT2: Après avoir lu un peu plus et allez par le biais de mon code avec le débogueur, étape par étape, et en comparant les rootviewcontrollers avec le childViewControllers j'ai observé que dans la méthode viewDidLoad de la childViewController après le réglage de l'auto.title = @"titre" le navigationItem est créé de sorte qu'il n'est pas le néant de la situation. Dans le débogueur quand je développez le _navigationItem variable le domaine _navigationBar est nul après avoir quitté viewDidLoad, dans le rootViewControllers la navigationBar n'est PAS NULL et le titre est là. J'ai lu que si le navigationBar est null, le titre ne sera pas affiché. Dans l'image est ce que j'ai vu dans le debuger. le texte d'alt http://img138.imageshack.us/img138/1513/picture2bq.png maintenant, je suis à la recherche dans cette direction.
EDIT1: ci-dessous le code de la parentViewController, firstChildViewController et deuxième ChildViewController.
le parentViewController est considéré(le titre est OK). Je presse un bouton sur le navigationBar que les appels bearbeitenAction -> le premier enfant est poussé(le titre n'est pas montré). Sur la barre de navigation de la firstChildViewController j'ai un bouton que lorsque la touche est enfoncée pousse un nouveau ViewController sur la pile(secondChildViewController). Le titre de la deuxième ChildViewController n'est pas ok. Lorsque j'appuie sur le titre de la firstChildViewController est montré Ok.
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 dans le code:
- (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 dans le code
- (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";
}
Je vais le prendre comme un compliment 🙂
OriginalL'auteur Sorin Antohi | 2010-02-15
Vous devez vous connecter pour publier un commentaire.
EDIT #2
J'ai regardé à travers votre code et tout semble ok. La seule chose qui semble hors de propos pour moi, c'est que vous ajoutez un sous-vue de la manette de navigation au lieu d'utiliser l'enfant du contrôleur de navigationItem. Je n'ai jamais vu faire de cette façon. Chaque ViewController a un UINavigationItem propriété qui représente le point de vue du contrôleur lorsqu'il est poussé sur une barre de navigation. Viens de lire à travers la Présentation de la documentation de fond.
Que NavigationItem a un titre, du bouton gauche et le bouton droit que vous pouvez définir... je voudrais essayer le réglage de vos boutons à ces propriétés, car en ajoutant des sous-vues de la manette de navigation il pourrait faire quelque chose de funky avec le titre... Encore une fois, je ne l'ai jamais vu faire de la façon dont vous le faire donc je ne suis pas vraiment sûr si c'est bon ou mauvais. Les seuls changements que vous avez à faire est de changer les boutons de la UIBarButtonItem classe. Lui donner un essai.
Original
La vue racine contrôleur est à l'index 0 du tableau... donc si tu fais ceci:
il sera toujours définir la racine du titre. Essayez de le faire à:
Il pourrait même être plus facile de faire ce genre de configuration dans le contrôleur enfant de viewWillAppear méthode... de cette façon, vous n'avez pas à rechercher par le biais de la manette de navigation des enfants pour l'affichage correct du contrôleur.
espère que cette aide
MODIFIER
Vous pouvez essayer SEULEMENT de définir le titre dans la méthode init:
De cette façon, vous êtes en permettant à l'objet de la méthode init à la charge de l'initialisation de l'objet de valeurs (ce qui est une bonne chose).
Hmmm... je ne vois pas grand chose d'autre, basé sur le code que vous avez posté. Avez-vous essayé d'entrer dans votre code avec le débogueur? Je sais que j'ai d'abord eu des problèmes avec ce genre de choses et pas à pas à travers elle m'a beaucoup aidé. Êtes-vous à l'aide de 2 différentes plumes pour vos points de vue ou sont-ils dans la même plume? Il n'y a pas beaucoup à définir le titre, c'est probablement quelque chose de vraiment petit.
je fais tout par le code. si j'ai mis en [soi.navigationItem setTitle:@"Modifier la liste de surveillance"]; et je pousse de la childViewController un autre point de vue, lorsque j'appuie sur le bouton "retour" pour aller à la childViewController le titre est réglé! lorsque que j'appuie sur "retour" pour aller à la tableView, puis sélectionnez une autre cellule, le titre n'est pas indiqué...
Il semble que vous définissez le titre sur le mauvais contrôleur. Si vous appelez setTitle sur soi-même et ensuite de pousser sur une vue enfant... alors le titre sera mis sur le parent. Ce que je suggère, c'est d'enlever tous les setTitle appels d'endroits où vous appuyez sur l'enfant-vues. De cette façon, vous avez seulement 1 titre du jeu par le contrôleur. Vous pouvez être sûr qu'il est en train d'être réglé que si vous créez une coutume méthode init où vous appelez de soi.title = @"myTitle"
découvrez le modifier à ma réponse
OriginalL'auteur Ryan Ferretti
Vous devez déplacer le
setup
code de laviewDidLoad
méthode à la place. LeviewDidLoad
est appelée lorsque l'élément de navigation a déjà été mis en place pour vous.Pour définir le titre, il suffit d'utiliser
self.title = @"my view";
- vous ne devez pas définir le titre directement sur le navigationItem.salut St3fan, j'ai ajouté un peu de code de la mère et des enfants, les contrôleurs de la modifier. je vais peut-être voir quelque chose de mal avec ce que j'ai fait. Merci!!!!
OriginalL'auteur Stefan Arentz
la source du problème était l'image de fond personnalisée pour la navigationBar que j'ai ajouté à l'aide de la méthode trouvée à cette adresse http://sebastiancelis.com/ . Fondamentalement, ce qui s'est passé et je cite l'auteur:
quand j'ai trouvé cette solution pour changer l'arrière-plan de la navigationBar j'étais assez sûr que je l'ai eu droit, mais il semble que je n'ai pas..
merci encore pour votre temps!
OriginalL'auteur Sorin Antohi