Question

Je l'ai mis en place une table groupée sur mon application, et pousser à de nouvelles vues fonctionne très bien. Sauf pour une chose. Les titres et la mise en page de la pile sont bizarres. Voici la répartition:

  1. J'ai deux sections dans ma table.
  2. Lorsque je tape sur la première ligne de la première section, il me faut à la vue correcte, mais le titre de la nouvelle vue est le nom de la première ligne dans la deuxième partie de la table.
  3. À son tour, la deuxième ligne du premier titre de section est la deuxième ligne dans le titre de la deuxième section.

Si je tape sur la deuxième ligne dans la deuxième partie de la table de vue racine, le bouton de navigation va à la deuxième ligne dans la premier de la table.

Alors, voici un diagramme de ma table:


Table Section 1 Ligne 1
Ligne 2
Ligne 3

Table Section 2 Ligne A
Ligne B
Ligne C


Donc, si je tape sur la ligne 3, le titre de la vue est poussé Ligne C. Le bouton de navigation me dit de revenir à la ligne 3, puis finalement se retrouver à la vue racine.

Voici mon dossier de mise en œuvre poussant les vues:

- (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];
    }

et le tableau d'alimentation de données de la table:

- (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;
}

Toute aide serait très apprécié.
Jack

Était-ce utile?

La solution

Je pense que vous manquez une instruction if pour déterminer quelle section, l'utilisateur tape sur. Rappelez-vous que NSIndexPath a à la fois une ligne et une propriété de section. Je fais quelque chose comme ceci:

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

Je suppose que vous utilisez une table groupée.

Cordialement, -Dan

Autres conseils

Dan est juste, vous devez utiliser la variable indexPath.section. Il semble que la façon dont votre code est maintenant, vous poussent en fait 2 contrôleurs de vue puisque vous avez une série de déclarations individuelles si, après avoir cliqué sur « Ligne 1 » ce qui suit se produit:

isEqual: @ "CSS" renvoie true,

pousser le contrôleur de vue css,

puis tomber vers le bas et garder le contrôle (si .. isEqual: @ "HTML") .. (si .. isEqual: @ "JavaScript")

alors bien sûr (si .. isEqual: @ "PHP"). Retourne également vrai et pousser le contrôleur de vue php

Je ne suis pas au courant de votre application entière, mais une observation que je remarque ici (en plus de fuites de mémoire) est vous avez un point de vue contrôleur / nib dédié à chaque langue .. si les contrôleurs de vue ont des comportements / apparences très différentes alors je suppose que ce que vous avez à faire, mais je vous recommande d'essayer de voir ce que les similitudes entre chacun d'eux et voir si vous ne pouvez pas faire un seul « LanguageViewController », passent dans quelle langue son supposé représenter et faire initialisation / définir les propriétés de le contrôleur d'affichage basé ce. Cela pourrait ne pas appliquer, mais si elle le fait vous sauverait beaucoup de travail!

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