Pregunta

en mi aplicación tengo una UITabBarController con UINavigationControllers inicializados como esto

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

newsViewController es un UIViewController. Al pulsar el botón de la barra de pestañas en mostrar el elemento de navegación con el newsViewController el título en la barra de navegación se fija bien. en el newsViewController Tengo una configuración de método que yo llamo después de init. En el método de configuración me puse el título como este [[self navigationItem] setTitle:[category_c title]];

El problema viene ahora, en mi newsViewController tengo un tableView, cuando toco una célula quiero empujar un UIViewController con la noticia seleccionada y en la barra de navegación para mostrar el título.

En el UIViewController tengo el mismo método de configuración en la que la configuración i el título como la de arriba. El problema es que no se muestra. El elemento de navegación no es nulo porque puedo llamar self.navigationItem.hidesBackButton = YES; y oculta la BackButton cada vez pero el título no se muestra.

creo y empujo la noticia UIViewController así cuando se toca una célula

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

El método de configuración en el newsViewController se ve así:

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

en el newsViewController tengo viewDidLoad y trató de establecer el título allí, pero sin éxito.

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

Si después de [self.navigationController pushViewController: newsViewController animated:YES]; escribo [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"]; la UIViewController que contiene el UITableView obtiene los myTitle título en lugar del newsViewController que empujé cuando toqué la célula.

cualquier punteros? No puedo entender por qué el título no se ha ajustado correctamente.

Edit2: Después de leer un poco más e ir a través de mi código con el depurador paso a paso y la comparación de los rootviewcontrollers con los childViewControllers he observado que en el método de la viewDidLoad childViewController después de establecer self.title = @ "título" del navigationItem se crea lo que no es la situación nula. En el depurador cuando amplío la variable _navigationItem la _navigationBar campo es nulo después de dejar viewDidLoad, en los rootViewControllers la navigationbar no es NULL y el título está ahí. He leído que si el navigationbar es nulo el título no se mostrará. En la imagen es lo que he visto en el debuger. alt texto http://img138.imageshack.us/img138/1513/picture2bq.png ahora estoy buscando en esta dirección.

EDIT1: a continuación es el código de la parentViewController, firstChildViewController y segundo ChildViewController. la parentViewController se ve (el título está bien). Se presiona un botón en el que llama a navigationbar bearbeitenAction -> el primer hijo es empujado (título no se muestra). En la barra de navegación de la firstChildViewController tengo un botón que cuando se presiona empuja un nuevo ViewController en la pila (secondChildViewController). El título de la segunda ChildViewController no está bien. Cuando pulso Volver el título de la firstChildViewController se mostró 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 en el 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 en 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";
}
¿Fue útil?

Solución 3

la fuente del problema era la imagen de fondo personalizado para el navigationbar que he añadido utilizando el método que se encuentra en esta dirección http: / /sebastiancelis.com/ . Básicamente lo que pasó fue y cito del autor:

  

Mediante el uso de una categoría, que podría fácilmente   añadir nuestra propia setBackgroundImage: Método   y llamarlo cada vez que se crea una   UINavigationBar o   UINavigationController. Este método   acaba de añadir un UIImageView como   subvista a la barra de navegación y luego   enviar ese subvista a la parte posterior de su   supervista.

     

Sin embargo, si se intenta esto le   ver rápidamente que sólo tipo de   trabajos. El UIImageView es definitivamente   visible e incluso inicialmente en el   correcta z-index. Sin embargo, una vez que se   empujar o hacer estallar una controlador de vista sobre la   pila del mando de navegación, se   verá que la imagen de fondo es   ya no está en el fondo. En lugar,   que bloquea el título y la navegación   botones de la barra. Esto definitivamente no es   lo que queremos.

Cuando encontré esta solución para cambiar el fondo de la navigationbar yo estaba bastante seguro de que lo tengo bien, pero parece que no lo hice ..

gracias de nuevo por su tiempo!

Otros consejos

editar # 2

Miré a través de su código y todo parece bien. La única cosa que parece fuera de lugar para mí es que va a añadir una subvista al controlador de navegación en lugar de utilizar el controlador de navigationItem niño. Nunca he visto que se haga de esta manera. Cada ViewController tiene una UINavigationItem propiedad que representa el controlador de vista cuando se empuja sobre una barra de navegación. Basta con leer a través de la introducción a la documentación para algunos antecedentes.

Eso NavigationItem tiene un título, botones izquierdo y derecho del botón que se puede establecer ... Me gustaría probar la configuración de los botones a esas propiedades, porque mediante la adición de subvistas al controlador de navegación que podría estar haciendo algo funky con el título. .. Una vez más, nunca he visto que se haga de la manera que lo está haciendo, así que no estoy muy seguro de si es correcto o incorrecto. Los únicos cambios que tendrán que hacer es cambiar los botones a la clase UIBarButtonItem. Darle una oportunidad.

ORIGINAL

El controlador de vista raíz está en el índice 0 en la matriz ... así que si hacer esto:

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

siempre establece el título de la raíz. Trate de hacerlo en:

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

Incluso podría ser más fácil de hacer este tipo de configuración en el método viewWillAppear del controlador niño ... de esa manera usted no tiene que buscar a través de los niños del controlador de navegación para el controlador de vista correcto.

esperanza esto ayuda

Editar Usted podría tratar de ajuste de sólo el título en el método init:

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

De esta manera, usted está permitiendo que el método init del objeto a ser el encargado de inicializar los valores del objeto (que es una buena cosa).

Debe moverse el código setup al método viewDidLoad lugar. El viewDidLoad se llama cuando el elemento de navegación ya ha sido configurado para usted.

Para establecer el título, basta con utilizar self.title = @"my view"; -. No debe establecer el título directamente en el navigationItem

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top