Question

dans mon application j'ai un UITabBarController avec UINavigationControllers initialisés comme ceci

UINavigationController *newsNavigationController = [[UINavigationController alloc] initWithRootViewController: newsViewControler];

newsViewController est un UIViewController. Lorsque j'appuie sur le bouton dans la barre d'onglets pour afficher l'élément de navigation avec le newsViewController le titre dans la barre de navigation est défini ok. dans le newsViewController j'ai une configuration de la méthode que j'appelle après initialisation. Dans la méthode de configuration i définir le titre comme celui-ci [[self navigationItem] setTitle:[category_c title]];

Le problème vient maintenant, dans mon newsViewController j'ai un tableView, quand je touche une cellule que 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 je configurer le titre comme ci-dessus. Le problème est que non représenté. L'élément de navigation n'est pas nul parce que je peux appeler self.navigationItem.hidesBackButton = YES; et cache le backbutton chaque fois, mais le titre n'apparaît pas.

créer et pousser les nouvelles UIViewController comme ça quand on touche une cellule

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 là, mais sans succès.

  • (void) {viewDidLoad self.navigationItem.title = @ "Test"; [Super viewDidLoad]; }

si après [self.navigationController pushViewController: newsViewController animated:YES]; j'écris [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"]; le UIViewController qui contient le UITableView obtient le titre myTitle au lieu du newsViewController que je poussais quand je touchais la cellule.

tous les pointeurs? Je ne comprends pas pourquoi le titre n'est pas correctement.

EDIT2: Après avoir lu un peu plus et en passant par mon code à l'étape de débogage par étape et en comparant les rootviewcontrollers avec les childViewControllers j'ai observé que, dans la méthode viewDidLoad du childViewController après avoir réglé self.title = @ « title » est créé le navigationItem il est donc pas la situation nulle. Dans le débogueur quand j'élargissons la variable _navigationItem le _navigationBar champ est nul après avoir quitté viewDidLoad, dans les rootViewControllers le navigationBar est NOT NULL et le titre est là. Je lis que si le navigationBar est nul le titre ne sera pas affiché. Dans l'image est ce que je l'ai vu dans le debuger. texte alt http://img138.imageshack.us/img138/1513/picture2bq.png maintenant je suis à la recherche dans ce sens.

EDIT1: ci-dessous est le code pour le parentViewController, firstChildViewController et deuxième ChildViewController. le parentViewController est considéré (le titre est OK). J'appuie sur un bouton sur la navigationBar qui appelle bearbeitenAction -> le premier enfant est poussé (titre n'est pas montré). Dans la barre de navigation du firstChildViewController j'ai un bouton lorsque vous appuyez sur une nouvelle pousse ViewController sur la pile (secondChildViewController). Le titre de la deuxième ChildViewController n'est pas correct. Quand je presse Retour 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";
}
Était-ce utile?

La solution 3

la source du problème était l'image d'arrière-plan personnalisé pour le navigationBar que j'ajouté en utilisant la méthode trouvée à cette adresse http: / /sebastiancelis.com/ . En fait ce qui est arrivé était et je cite l'auteur:

  

En utilisant une catégorie, on pourrait facilement   ajouter notre propre setBackgroundImage: méthode   et l'appeler à chaque fois que nous créons un   UINavigationBar ou   UINavigationController. Cette méthode   serait tout simplement ajouter un UIImageView comme   au sous-vue la barre de navigation, puis   envoyer cette sous-vue à l'arrière de son   superview.

     

Cependant, si vous essayez cela, vous aurez   voir rapidement qu'il ne sorte de   travaux. Le UIImageView est sans aucun doute   visible et même d'abord au   correct z-index. Cependant, une fois que vous   pousser ou sauter un contrôleur de vue sur la   La pile de contrôleur de navigation, vous   verront que l'image d'arrière-plan   plus en arrière-plan. Au lieu,   il bloque sur le titre et la navigation   boutons de la barre. Ceci est certainement pas   ce que nous voulons.

quand je l'ai trouvé cette solution pour changer l'arrière-plan de la navigationBar je me doutais bien que je l'ai eu droit, mais il semble que je ne l'ai pas ..

merci encore pour votre temps!

Autres conseils

EDIT # 2

Je regardais à travers votre code et tout semble correct. La seule chose qui donne de la place pour moi est que vous ajoutez un sous-vue au contrôleur de navigation au lieu d'utiliser navigationItem du contrôleur de l'enfant. Je ne l'ai jamais vu faire de cette façon. Chaque ViewController a UINavigationItem propriété qui représente le dispositif de commande d'affichage quand il est poussé sur une barre de navigation. Il suffit de lire à travers la vue d'ensemble de la documentation pour le contexte.

Ce NavigationItem a un titre, le bouton gauche et à droite bouton que vous pouvez définir ... J'essayez de régler vos boutons à ces propriétés, car en ajoutant subviews au contrôleur de la navigation, il pourrait faire quelque chose de funky avec le titre. .. Encore une fois, je ne l'ai jamais vu faire la façon dont vous le faites donc je ne suis pas vraiment sûr si elle est bonne ou mauvaise. Les seuls changements, vous devrez faire est de changer les boutons de la classe UIBarButtonItem. Lui donner un essai.

Original

Le contrôleur de vue racine est à l'index 0 dans le tableau ... donc si vous faites ceci:

[[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"]

il sera toujours mis le titre de la racine. Essayez de le faire à:

objectAtIndex:([self.navigationController.viewControllers count] - 1)

Il pourrait même être plus facile de faire ce genre de configuration dans la méthode viewWillAppear du contrôleur enfant ... De cette façon vous n'avez pas à chercher dans les enfants du contrôleur de navigation pour le contrôleur de vue correcte.

espérons que cette aide

EDIT Vous pouvez essayer de régler seul le titre dans la méthode init:

-(id)init {
    if (self = [super init]) {
        self.title = @"My Title";
    }
    return self;
}

De cette façon, vous autorisez la méthode d'initialisation de l'objet à être en charge de l'initialisation des valeurs de l'objet (ce qui est une bonne chose).

Vous devez déplacer le code setup à la méthode viewDidLoad à la place. La viewDidLoad est appelée lorsque l'élément de navigation a déjà été configuré pour vous.

Pour définir le titre, utilisez simplement self.title = @"my view"; -. Vous ne devriez pas définir le titre directement sur le navigationItem

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top