Pregunta

He creado una tabla agrupada en mi aplicación, y empujando a nuevos puntos de vista bien funciona. Excepto por una cosa. Los títulos y el diseño de pila son raro. Aquí está el desglose:

  1. Tengo dos secciones en mi mesa.
  2. Al tocar en la primera fila de la primera sección, me lleva a la visión correcta, pero el título de la nueva vista es el nombre de la primera fila en la segunda sección de la tabla.
  3. A su vez, la segunda fila en el título de la primera sección es la segunda fila en el título de la segunda sección.

Si giro en la segunda fila en la segunda sección de la tabla vista raíz, el botón de navegación pasa a la segunda fila de la primero de la tabla.

Así que aquí hay un diagrama de mi mesa:


Sección Tabla 1
Fila 1
Fila 2
Fila 3

Sección Tabla 2
Una fila
Fila B Opiniones Fila C


Así que si yo toque en la fila 3, el título de la vista es empujado a la fila C. El botón de navegación me dice que volver a la fila 3, a continuación, eventualmente terminando en la vista raíz.

Aquí está mi archivo de implementación empujando los puntos de vista:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    //CSS
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"CSS"])
    {
        CSSViewController *css = [[CSSViewController alloc] initWithNibName:@"CSSViewController" bundle:nil];
        [css setTitle:@"CSS"];
        [self.navigationController pushViewController:css animated:YES];
    }

    //HTML
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"HTML"])
    {
        HTMLViewController *html = [[HTMLViewController alloc] initWithNibName:@"HTMLViewController" bundle:nil];
        [html setTitle:@"HTML"];
        [self.navigationController pushViewController:html animated:YES];
    }

    //JS
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"JavaScript"])
    {
        JSViewController *js = [[JSViewController alloc] initWithNibName:@"JSViewController" bundle:nil];
        [js setTitle:@"JavaScript"];
        [self.navigationController pushViewController:js animated:YES];
    }

    //PHP
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"PHP"])
    {
        PHPViewController *php = [[PHPViewController alloc] initWithNibName:@"PHPViewController" bundle:nil];
        [php setTitle:@"PHP"];
        [self.navigationController pushViewController:php animated:YES];
    }

    //SQL
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"SQL"])
    {
        SQLViewController *sql = [[SQLViewController alloc] initWithNibName:@"SQLViewController" bundle:nil];
        [sql setTitle:@"SQL"];
        [self.navigationController pushViewController:sql animated:YES];
    }

& alimentación de la matriz de datos de la tabla:

- (void)viewDidLoad {
    [super viewDidLoad];


    arryClientSide = [[NSArray alloc] initWithObjects:@"CSS",@"HTML",@"JavaScript",nil];
    arryServerSide = [[NSArray alloc] initWithObjects:@"Objective-C", @"PHP",@"SQL",nil];
    // arryResources = [[NSArray alloc] initWithObjects:@"HTML Colour Codes", @"Useful Resources", @"About",nil];
    self.title = @"Select a Language";
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

Cualquier ayuda sería en gran medida apreciado.
Jack

¿Fue útil?

Solución

creo que se echa en falta una sentencia if para determinar qué sección el usuario dio un golpecito en. Recuerde que NSIndexPath tiene tanto una fila y una propiedad de sección. Yo suelo hacer algo como esto:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if ( indexPath.section == 0 ) {
  // Do something with arryClientSide
}
if ( indexPath.section == 1 ) {
  // Do something with arryServerSide
}

Estoy asumiendo que usted está utilizando una tabla con grupos.

Cheers, -dan

Otros consejos

Dan tiene razón, es necesario utilizar la variable indexPath.section. Parece que la forma en que su código es ahora, en realidad está empujando 2 controladores de vista ya que tiene una serie de declaraciones individuales si, después de hacer clic en "fila 1" ocurre lo siguiente:

IsEqual: @ "CSS" devolverá verdadero,

empujar el controlador de vista css,

luego bajar y mantener la comprobación (si .. IsEqual: @ "HTML") .. (si .. IsEqual: @ "JavaScript")

A continuación, efectivamente (si .. IsEqual: @ "PHP"). También volverá verdadera y empuje el controlador de vista php

No estoy al tanto de toda la aplicación, pero una observación noto aquí (además de las pérdidas de memoria) es que tienen un punto de vista controlador / plumín dedicado a cada idioma .. si los controladores de vista tienen muy diferentes comportamientos / apariencias entonces supongo eso es lo que tiene que hacer, pero yo recomendaría tratar de ver cuáles son las similitudes entre cada uno y ver si no se puede hacer una sola "LanguageViewController", pasan idioma de su supuesto para representar y hacer la inicialización / set las propiedades de el controlador de vista basa fuera que. Esto podría no aplicar, pero si lo hace, le ahorraría mucho trabajo!

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