2011-06-24 7 views
1

Soit ont deux tableaux mutables et Ayons le code suivant:problème étrange avec [tableView reloadData]

- (void)viewDidLoad 
{ 
    NSMutableArray *A = [[NSMutableArray alloc] init]; 
    NSMutableArray *B = [[NSMutableArray alloc] init]; 
    // fill up A 
    // B remains empty 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // ... 
    if (...) 
    { 
     // fill up the cell with datas of an object from A 
    } 
    else 
    { 
     // fill up the cell with datas of an object from B 
    } 
    //... 
    return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (...) 
    { 
     // remove an object from A and put it in B 
    } 
    else 
    { 
     // remove an object from B and put in A 
    } 
    [tableView reloadData]; 
} 

Si [tableView reloadData] est commenté (// [tableView reloadData]), qu'après la "click" la table ne sera pas invalidée, comme prévu. Et si la cellule actuelle défilait et faisait de nouveau défiler dans l'écran, "cellForRowAtIndexPath" est appelé et la cellule "dessiné" à droite selon le tableau duquel devrait être obtenu son contenu. Mais si [tableView reloadData] est actif, alors que "cellForRowAtIndexPath" n'est pas appelé du tout (!) Et la cellule est supprimée de l'écran!

réaction: WHUT?

peut me aider quiconque comment invalider l'tableview à la volée (non en faisant défiler hors de la cellule et dans :))!

Merci d'avance!

+0

Je ferais la mise à jour des cellules affectées dans la méthode didSelectRowAtIndexPath plutôt que d'y appeler reloadData. – onnoweb

+0

Avez-vous utilisé différents identifiants de cellules? –

+0

Avez-vous essayé d'utiliser 'delete/insertRowsAtIndexPaths: withRowAnimation'? Tant que vos tableaux correspondent aux changements, ceci devrait apporter une modification immédiate à votre tableView sans avoir besoin d'appeler 'reloadData'. – justin

Répondre

0

C'était ma faute .. Il est une très bonne expérience pour moi au sujet de cette chose. La méthode:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [A count] + [B count]; 
} 

ne contenait [A count] et [count B] pas .. En fait, avec reloadData il Wors propery. Quoi qu'il en soit, cela fonctionne grâce au défilement vers le haut - défiler vers le bas tandis que le numberOfRowsInSection n'est pas interrogé à nouveau.

Merci à tous pour votre soutien!

0

Vous devez utiliser le UITableView method -deleteRowsAtIndexPath ... pour effectuer la supprimer, vous essayez d'atteindre. Apple peut ne pas approuver ce paradigme de l'interface utilisateur, car il viole le HIG.

Tenir compte en utilisant la propriété de montage, ainsi que -commitEditingStyle... of the UITableViewDatasource pour faire supprimer. Les utilisateurs seront déjà familiarisés avec cette utilisation de la vue tabulaire et ne risquent pas d'être rejetés par Apple.

+0

Merci pour la réponse, mais je ne le comprends pas. Je ne veux pas supprimer de ligne. Je souhaite placer un objet d'un tableau dans l'autre tableau, lorsque l'utilisateur appuie dessus. Et les deux tableaux devraient être visibles dans la tableview. Imaginez simplement, comme le tableau B contiendrait les objets sélectionnés avec un tri appliqué sur eux. Le tableau A contient les objets non sélectionnés. Les cases à cocher simples ne suffisent pas, alors qu'il n'y a pas de méthode de tri. C'était juste un exemple pour décrire le problème, la vraie tâche est un peu plus complexe. – Barna

+0

Vous pourriez vouloir reconsidérer votre approche du problème. Essayer d'utiliser deux tableaux pour suivre les objets fusionnés dans une seule table, sans sections, va être plutôt douloureux. Peut-être pourriez-vous utiliser la table avec les sélections, le tri, tout ce dont vous avez besoin, sur un seul tableau, et quand l'utilisateur a fini (soit en appuyant sur un bouton ou en fermant l'application) itérer sur le tableau et construire vos deux représentations point. Sinon, vous allez vous battre avec UITableView un peu. – RyanR

Questions connexes