2009-06-01 4 views
0

J'ai créé un UITableView par programmation (sans utiliser de XIB). Il lit un fichier * .plist contenant un NSMutableArray d'objets NSDictionary. Le problème que je rencontre est le suivant: Lorsque j'affiche les objets dans UITableView, il ne montre jamais l'objet à la ligne zéro. Je sais que cela parce que je reçois la sortie NSLog suivante:Toujours une ligne manquante dans UITableView

2009-06-01 10:02:34.566 Color[784:20b] array count = 4 
2009-06-01 10:02:34.570 Color[784:20b] row = 3: Air 
2009-06-01 10:02:34.570 Color[784:20b] row = 2: Earth 
2009-06-01 10:02:34.571 Color[784:20b] row = 1: Water 
2009-06-01 10:02:34.571 Color[784:20b] row = 0: Fire 

Ce que je vais voir, dans ce cas, est une table avec l'eau, la terre et l'air (mais pas de feu). Si j'ajoute un autre objet, Fire apparaîtra mais le nouvel objet ne le sera pas. Par conséquent, il est toujours l'objet à la ligne 0.

Voici un code pertinent:

@interface LoadViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> { 
    NSMutableArray *loadedObjects; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    self.loadedObjects = [self getCurrentData]; 
    NSLog(@"array count = %d", [self.loadedObjects count]); 
    [self.tableView reloadData]; 
    [super viewWillAppear:animated]; 
} 

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section { 
    return [self.loadedColors count]; 
} 

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { 
    static NSString *Identifier = @"Identifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier]; 
    if(cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:Identifier] autorelease]; 
     cell.showsReorderControl = YES; 
    } 
    NSUInteger row = [indexPath row]; 
    NSDictionary *obj = [self.loadedObjects objectAtIndex:row]; 
    cell.text = [obj objectForKey:@"Name"]; 
    NSLog(@"row = %d: %@", row, [obj objectForKey:@"Name"]); 
    return cell; 
} 

Dans les extraits de code, vous pouvez également voir ma sortie NSLog.

Lorsque j'avais peuplé UITableViews à partir d'un NIB, je n'avais jamais rencontré ce problème. Toutes les suggestions sont appréciées.

Merci à l'avance.

+0

Devrions-nous supposer que les séparés loadedObjects et loadedColors sont une faute de frappe ici? –

+0

Excepté cette faute de frappe, cela semble bon code. Je commencerais par désactiver l'affectation cell.text pour quelque chose de statique, ou quelque chose comme "Cell% d". De cette façon, vous pouvez isoler la partie UITableView des objets loadedObjects et voir quel est le problème. –

+0

Peut-être ajouter un point d'arrêt sur cellForRowAtIndexPath et vérifier que votre propriété 'loadedObjects' contient toujours ce que vous attendez qu'il contienne? – Hunter

Répondre

1

Je me sens un peu stupide, mais peut-être cela pourrait être utile à quelqu'un d'autre ...

Ce que j'omis de mentionner dans ma description (parce que je ne pensais pas qu'il était pertinent) était le fait que je également instancié un UINavigationBar pour avoir un bouton Modifier dans le coin supérieur droit. En un mot, la barre de navigation obscurcissait le premier enregistrement de la table.

La raison pour laquelle je ne pouvais pas voir c'est parce que je l'ai fait:

[self.tableView addSubview:navBar]; 

et ce qui a fait était de « coller » la barre de navigation à la table, si le défilement ne pouvait pas révéler la ligne manquante. Quand j'ai changé cette ligne à:

[self.appDelegate.window addSubview:navBar]; 

je pouvais faire glisser le premier enregistrement de sous la barre de navigation, car ils deviennent alors des vues frères et soeurs.

Je m'excuse pour la question mal placée.

+1

Pourquoi est-ce que vous ajoutez manuellement une barre de navigation au lieu d'utiliser UINavigationController qui ajoute automatiquement une barre de navigation aux contrôleurs de vue masqués? –

+0

Merci, cela m'a aidé à résoudre un gros problème lors de ma première tentative Swift/UITableView. Je n'ai jamais pu voir les premières lignes de mon UITableView parce que je l'ai fait plus grand que son ViewController! –