0

J'ai mis en place une table groupée sur mon application, et pousser vers de nouvelles vues fonctionne très bien. Sauf pour une chose. Les titres et la disposition de la pile sont tous bizarres. Voici la répartition:iPhone: tables groupées et problèmes de contrôleur de navigation

  1. J'ai deux sections dans ma table.
  2. Lorsque j'appuie sur la première ligne de la première section, cela m'amène à la vue correcte, mais le titre de la nouvelle vue est le nom de la première ligne de la deuxième section de la table.
  3. À son tour, la deuxième rangée dans le titre de la première section est la deuxième rangée 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 de la première section de la table.

Alors, voici un diagramme de ma table:


Tableau Section 1
Ligne 1
Row 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 poussé est rangée C. Le bouton de navigation me dit de revenir à la rangée 3, puis finalement se retrouver à la vue racine.

Voici mon fichier 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]; 
    } 

& le tableau d'alimentation des 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 grandement apprécié.
Jack

+2

Fuite de mémoire sacrée, Batman! (Chaque fois que vous 'alloc/init' un nouveau viewController, vous devez le' libérer 'après l'avoir poussé) –

+0

@Dave +1 pour le * batman *! – bddckr

Répondre

4

Je pense qu'il vous manque une instruction if pour déterminer sur quelle section l'utilisateur a tapé. Rappelez-vous que NSIndexPath a à la fois une propriété row et une propriété section. Je fais généralement 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.

Cheers, -Dan

+0

Génial, merci. –

0

Dan a raison, vous devez utiliser la variable indexPath.section.Il semble que votre code est maintenant, vous êtes en train de pousser 2 contrôleurs de vue puisque vous avez une série d'instructions individuelles, après que vous cliquez sur "Row 1" ce qui suit arrive:

isEqual: @ "CSS" retournera vrai ,

pousser le contrôleur de vue css,

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

puis bien sûr (si .. isEqual: @ "PHP") retournera aussi vrai et poussera le contrôleur de vue php. Je ne suis pas au courant de l'ensemble de votre application mais une remarque que je remarque ici (en plus des fuites de mémoire) est que vous avez un contrôleur de vue/nib dédié à chaque langue .. si les contrôleurs de vue ont des comportements/apparences suppose que c'est ce que vous avez à faire, mais je recommanderais d'essayer de voir quelles sont les similitudes entre chacun et voir si vous ne pouvez pas faire un seul "LanguageViewController", passer dans quelle langue est censé représenter et initialiser/définir les propriétés du contrôleur de vue basé sur cela. Cela pourrait ne pas s'appliquer, mais si c'est le cas, cela vous épargnerait beaucoup de travail!

+0

En ce qui concerne la dernière chose que vous avez mentionnée, aurai-je juste besoin d'une plume qui contrôlera toutes les langues? J'ai créé des plumes individuelles lorsque Xcode les a créées pour moi lorsque j'ai créé un viewcontroller. Ensuite, j'alimente le contrôleur de vue avec un tableau pour créer une autre table. Serais-je capable de nourrir les données de chaque langage de programmation d'une plist? Et serais-je alors en mesure de créer un contrôleur de navigation pour contrôler chaque élément de la plist? –

+0

Oui, cela ressemble à une situation où vous deviez créer un "LanguageViewController" (et nib), créer une fonction init personnalisée avec un argument de chaîne de langue supplémentaire puis dans la fonction init faire quelque chose comme (le code suivant est bien sûr) : if (la langue est égale à "CSS") charge les données de CSS.plist; sinon if (la langue est égale à "HTML") charge les données de HTML.plist; etc. simplement une suggestion cependant, en cas de doute, faites ce qui vous semble le plus logique. – Tom

+0

À droite, donc je voudrais simplement modifier tous les initWithNibName sur mon code à la nouvelle nib LanguageViewController? –

Questions connexes