NavigationItem setTitle funktioniert nicht für die zweite Ebene UIViewController
in meiner app habe ich ein UITabBarController mit UINavigationControllers initialisiert, wie dies
UINavigationController *newsNavigationController = [[UINavigationController alloc] initWithRootViewController: newsViewControler];
newsViewController ist ein UIViewController.
Wenn ich die Taste in der tabbar, um zu zeigen, das Navigations-Element mit der newsViewController die Titel in der Navigationsleiste festgelegt ist ok. in der newsViewController ich habe eine Methode, die setup, dass ich nach der init. In der setup-Methode, die ich Titel wie diesem
[[self navigationItem] setTitle:[category_c title]];
Das problem kommt jetzt, in meiner newsViewController ich habe einen tableView, wenn ich berühre eine Zelle möchte ich eine push-UIViewController mit dem ausgewählte Nachrichten und in der Navigationsleiste auf den Titel.
In der UIViewController ich habe das gleiche setup-Methode, in dem ich ein setup der Titel wie oben. Das problem ist, dass nicht gezeigt wird. Das Navigations-Element ist nicht null, weil ich anrufen kann self.navigationItem.hidesBackButton = YES;
und es blendet die Schaltflächen "backbutton" jedes mal, aber der Titel wird nicht angezeigt.
Ich erstellen und push die Nachrichten UIViewController wie diese, wenn eine Zelle berührt wird
if(newsViewController == nil){
newsViewController = [[NewsViewController alloc] init];
[newsViewController setup];
}
[self.navigationController pushViewController: newsViewController animated:YES];
Die setup-Methode in der newsViewController sieht wie folgt aus:
- (void) setup {
self.navigationItem.hidesBackButton = YES;
[self.navigationItem setTitle:@"my view"];
}
in der newsViewController ich habe viewDidLoad und versucht, den Titel gibt es, aber ohne Erfolg.
- (void)viewDidLoad {
selbst.navigationItem.title = @"Test";
[super viewDidLoad];
}
wenn nach [self.navigationController pushViewController: newsViewController animated:YES];
ich Schreibe [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"];
den UIViewController, enthält die UITableView bekommt den title myTitle statt der newsViewController, dass ich geschoben habe, wenn ich Sie berührte die Zelle.
irgendwelche Hinweise? ich kann nicht verstehen, warum der Titel nicht richtig eingestellt ist.
EDIT2: Nach der Lektüre ein wenig mehr und gehen durch meinen code mit dem debugger Schritt für Schritt und Vergleich der rootviewcontrollers mit der childViewControllers ich habe beobachtet, dass in der viewDidLoad-Methode der childViewController nach der Einstellung selbst.title = @"Titel" die navigationItem erstellt, es ist also nicht die null-Lage. Im debugger, wenn ich erweitern die _navigationItem variable Bereich _navigationBar nil, nach dem verlassen viewDidLoad, in der rootViewControllers die navigationBar ist NICHT NULL und der Titel ist da. Ich habe gelesen, dass wenn die navigationBar ist null, der Titel wird nicht angezeigt. Im Bild ist das, was ich gesehen habe in der debuger. alt-text http://img138.imageshack.us/img138/1513/picture2bq.png jetzt bin ich auf der Suche in dieser Richtung.
EDIT1: unten ist der code für die parentViewController, firstChildViewController und zweiten ChildViewController.
die parentViewController angezeigt wird(der Titel ist OK). Ich drücke eine Taste auf der navigationBar, dass Anrufe bearbeitenAction -> das erste Kind geschoben wird(Titel ist nicht gezeigt). Auf der Navigationsleiste der firstChildViewController ich habe einen button, dass wenn gedrückt wird, schiebt Sie einen neuen ViewController auf den Stapel(secondChildViewController). Der Titel des zweiten ChildViewController ist nicht ok. Wenn ich drücken Sie Wieder den Titel des firstChildViewController wird gezeigt, 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 in den 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 in 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";
}
Ich nehme es als Kompliment 🙂
InformationsquelleAutor Sorin Antohi | 2010-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT #2
Sah ich durch deinen code und alles scheint okay zu sein. Das einzige, was, das sieht aus Platz für mich ist, dass Sie hinzufügen eine Untersicht auf den navigation-controller, anstatt mit dem Kind Controllers navigationItem. Ich habe nie gesehen, dass es auf diese Weise getan. Jeder ViewController hat eine UINavigationItem Eigenschaft, vertritt die Ansicht-controller, wenn es geschoben wird, ist auf eine Navigationsleiste. Lesen Sie einfach durch die Übersicht über die Dokumentation für einige Hintergrundinformationen.
Dass NavigationItem hat einen Titel, eine Links-Taste und rechts-Taste, die Sie festlegen können... ich würde versuchen, die Einstellung der Schaltflächen für diese Eigenschaften, weil durch das hinzufügen von Untersichten an den navigation controller, könnte es etwas funky mit dem Titel... Nochmal, ich habe es noch nie gesehen getan, wie Sie sind, es zu tun, so dass ich 'm nicht wirklich sicher, ob es richtig oder falsch ist. Die einzigen änderungen, die Sie machen müssen, ist, ändern Sie die Tasten, um die Klasse UIBarButtonItem. Probieren Sie es aus.
Original
Root-Ansicht-controller mit dem index 0 im array... also, wenn Sie, dies zu tun:
es wird immer das root-Titel. Versuchen Sie es auf:
Könnte es sogar leichter sein, diese Art von setup in der untergeordneten controller die Methode viewWillAppear... so dass Sie nicht haben, um die Suche durch die navigation-controller für die Kinder die richtige view-controller.
hoffe, das hilft
BEARBEITEN
Sie könnten versuchen, die Einstellung NUR die Titel in der init-Methode:
Diese Weise, Sie zu, dass das Objekt die Methode init zu werden, in der die Initialisierung des Objekts Werte (was eine gute Sache ist).
Hmmm... ich sehe nicht viel anderes, basierend auf dem code, den Sie geschrieben haben. Haben Sie versucht, schrittweise durch den code mit dem debugger? Ich weiß, dass ich zuerst Probleme hatte, mit diesem Zeug und schrittweise, es hat mir sehr geholfen. Sind Sie mit 2 verschiedenen Federn für Ihre Ansichten, oder sind Sie in der gleichen Feder? Gibt es nicht viel, um die Einstellung der Titel, so ist es wohl wirklich etwas klein.
ich mache alles per code. wenn ich [selbst.navigationItem setTitle:@"Bearbeiten " Beobachtungsliste"]; und ich Schiebe von der childViewController eine andere Ansicht, wenn ich drücken Sie die Schaltfläche "zurück" zu gehen, um die childViewController der Titel ist gesetzt! wenn ich push "zurück" wieder zu den tableView und wählen Sie dann eine andere Zelle, wird der Titel nicht angezeigt...
Es scheint, wie Sie setzen den Titel auf der falschen controller. Wenn der Aufruf setTitle auf sich selbst und dann drückt auf einen Kind-Stadtplan... dann der Titel wird auf die Muttergesellschaft. Was ich vorschlagen würde ist das entfernen aller setTitle Anrufe von Orten, wo Sie drängen auf Kind-Ansichten. So haben Sie nur 1 Titel pro controller. Sie können sicher sein, dass es eingestellt wird, wenn Sie erstellen ein benutzerdefiniertes init-Methode, wo Sie anrufen selbst.title = @"myTitle"
überprüfen Sie heraus das edit auf meine Antwort
InformationsquelleAutor Ryan Ferretti
Sollten Sie das
setup
code zumviewDidLoad
- Methode statt. DieviewDidLoad
aufgerufen wird, wenn die Navigations-Element wurde bereits setup für Sie.Zum festlegen des Titels, verwenden Sie einfach
self.title = @"my view";
- Sie sollte nicht die Titel direkt auf dem navigationItem.hi St3fan, ich habe einen code aus der übergeordneten und untergeordneten view-Controller in der edit. vielleicht werde ich etwas falsch mit dem, was ich Tat. Danke!!!
InformationsquelleAutor Stefan Arentz
die Quelle des Problems war die benutzerdefinierten hintergrund Bild für die navigationBar, dass ich mit der Methode unter dieser Adresse zu finden http://sebastiancelis.com/ . Im Grunde, was passiert war und ich zitiere den Autor:
wenn ich fand diese Lösung für das ändern der hintergrund der navigationBar war ich mir ziemlich sicher, dass ich es hinbekommen aber es scheint, ich nicht..
danken Ihnen nochmals für Ihre Zeit!
InformationsquelleAutor Sorin Antohi