Pergunta

No meu aplicativo, tenho um uitabbarcontroller com uinavigationcontrollers inicializados como este

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

NewsViewController é um UIViewController. Quando pressiono o botão no TabBar para mostrar o item de navegação com o NewsViewController, o título na barra de navegação é definido OK. No NewsviewController, tenho uma configuração de método que chamo após o init. No método de configuração, defino o título como este[[self navigationItem] setTitle:[category_c title]];

O problema vem agora, no meu NewsViewController, tenho uma tabela de tabela, quando toco uma célula, quero pressionar um UIViewController com as notícias selecionadas e na barra de navegação para mostrar o título.

No UiviewController, tenho o mesmo método de configuração no qual configurei o título como acima. O problema é que isso não é mostrado. O item de navegação não é nulo porque posso ligar self.navigationItem.hidesBackButton = YES; E esconde o butão sempre, mas o título não é mostrado.

Eu crio e pressiono a notícia uiViewController como essa quando uma célula é tocada

if(newsViewController == nil){
        newsViewController = [[NewsViewController alloc] init];
        [newsViewController setup];
    }
    [self.navigationController pushViewController: newsViewController animated:YES];

O método de configuração no NewsviewController se parece com o seguinte:

- (void) setup {
    self.navigationItem.hidesBackButton = YES;
    [self.navigationItem setTitle:@"my view"];
}

No NewsviewController, tenho ViewDidload e tentei definir o título lá, mas sem sucesso.

  • (void) ViewDidload {self.navigationItem.title = @"test"; [super viewDidload]; }

se depois [self.navigationController pushViewController: newsViewController animated:YES];escrevo [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"]; O UIViewController que contém o UitableView recebe o título Mytitle, em vez do NewsViewController que empurrei quando toquei na célula.

Algum indicador? Não consigo entender por que o título não está definido corretamente.

Edit2: depois de ler um pouco mais e passar pelo meu código com o depurador passo a passo e comparar os rootViewControllers com os ChildViewControllers, observei que no método ViewDidload do ChildViewController depois de definir self.title = @"title" o navegação é Criado para que não seja a situação nula. No depurador, quando expandi a variável _navigationItem, o campo _navigationBar é nulo após deixar o ViewDidload, no rootViewControllers, o NavigationBar não é nulo e o título está lá. Eu li que, se o NavigationBar for nulo, o título não será exibido. Na imagem está o que eu vi no depurador. TEXTO DE ALT HTTP://IMG138.IMAGESHACK.US/IMG138/1513/PICTURE2BQ.PNG Agora estou pesquisando nessa direção.

EDIT1: Abaixo está o código para o ParentViewController, FirstChildViewController e Second ChildViewController. O ParentViewController é visualizado (o título está OK). Eu pressiono um botão no NavigationBar que chama BearBeitenAction -> O primeiro filho é empurrado (o título não é exibido). Na barra de navegação do FirstChildViewController, tenho um botão que, quando é pressionado, empurra um novo ViewController na pilha (SecondChildViewController). O título do segundo ChildViewController não está ok. Quando pressiono o título do FirstChildViewController é mostrado 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 no código:

- (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 no código

- (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";
}
Foi útil?

Solução 3

A fonte do problema era a imagem de fundo personalizada para o NavigationBar que eu adicionei usando o método encontrado neste endereço http://sebastianellis.com/ . Basicamente, o que aconteceu foi e eu cito do autor:

Usando uma categoria, poderíamos adicionar facilmente nosso próprio setbackgroundImage: Método e chamá -lo sempre que criamos um UinAvigationBar ou UinavigationController. Esse método apenas adicionaria uma View UIImage como uma subview à barra de navegação e depois enviaria essa subvieva para a parte traseira de sua supervisão.

No entanto, se você tentar isso, verá rapidamente que apenas funciona. O UIImageView é definitivamente visível e até inicialmente no índice Z correto. No entanto, uma vez que você empurre ou coloque um controlador de exibição na pilha do controlador de navegação, você verá que a imagem de fundo não está mais em segundo plano. Em vez disso, ele bloqueia os botões do título e da barra de navegação. Definitivamente, isso não é o que queremos.

Quando encontrei essa solução para alterar o fundo do NavigationBar, eu tinha certeza de que acertou, mas parece que não fazia ..

Mais uma vez obrigado pelo seu tempo!

Outras dicas

Editar #2

Eu olhei através do seu código e tudo parece bem. A única coisa que me parece fora de lugar é que você está adicionando uma subview ao controlador de navegação em vez de usar o NavigationItem do controlador filho. Eu nunca vi isso feito assim. Cada viewcontroller tem um UinavigationItem Propriedade que representa o controlador de exibição quando for empurrado para uma barra de navegação. Basta ler a visão geral da documentação para alguns antecedentes.

Que o NavigationItem tem um título, o botão esquerdo e o botão direito que você pode definir ... eu tentaria definir seus botões para essas propriedades, porque adicionando subviews ao controlador de navegação, ele poderia estar fazendo algo descolado com o título ... novamente , Eu nunca vi isso feito da maneira que você está fazendo, então não tenho certeza se está certo ou errado. As únicas alterações que você precisará fazer é alterar os botões para a classe Uibarbuttonitem. De uma chance.

Original

O controlador de visão raiz está no índice 0 na matriz ... então se você estiver fazendo isso:

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

Ele sempre definirá o título da raiz. Tente fazer isso em:

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

Pode até ser mais fácil fazer esse tipo de configuração no método ViewWillappear do controlador filho ... dessa forma, você não precisa pesquisar nos filhos do controlador de navegação pelo controlador de exibição correto.

espero que isto ajude

EDITARVocê pode tentar definir apenas o título no método init:

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

Dessa forma, você está permitindo que o método init do objeto seja responsável por inicializar os valores do objeto (o que é uma coisa boa).

Você deve mover o setup código para o viewDidLoad método em vez disso. o viewDidLoad é chamado quando o item de navegação já foi configurado para você.

Para definir o título, basta usar self.title = @"my view"; - Você não deve definir o título diretamente no NavigationItem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top