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";
}
Tolle Erklärung... tl; dr;
Ich nehme es als Kompliment 🙂

InformationsquelleAutor Sorin Antohi | 2010-02-15

Schreibe einen Kommentar