2009-07-28 8 views
2

J'essaie de créer une vue de table similaire à la vue de téléchargement de vidéos YouTube dans la galerie de photos sur l'iPhone.UITextField dans UITableViewCell - ajout de nouvelles cellules

Voici la configuration de base.

J'ai créé un UITableViewCell personnalisé qui contient un UITextField. L'affichage de la cellule dans ma table fonctionne très bien et je peux éditer le texte sans problèmes. J'ai créé un crochet d'événement afin que je puisse voir quand le texte a changé dans le champ de texte.

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged] 

Ce que je veux faire est ceci. Lorsque l'utilisateur d'abord édite le texte que je veux insérer une nouvelle cellule dans la vue tableau ci-dessous la cellule courante (newIndexPath est calculé avant la bonne position):

[self.tableView beginUpdates]; 
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationBottom]; 
[self.tableView endUpdates]; 

Le problème est quand je lance le code d'insertion de cellules de la La cellule est créée mais le texte du champ de texte est mis à jour brièvement, mais le clavier est fermé et le champ de texte est remis à une chaîne vide.

Toute aide serait géniale! Je me suis cogné la tête à propos de celui-ci toute la journée.

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 
{ 
    if (section == 0) 
     return 2; 
    else 
     return self.tags.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ... 
    cell = (SimpleTextFieldTableCell *)[tableView dequeueReusableCellWithIdentifier:tagCellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"SimpleTextFieldTableCell" owner:nil options:nil] lastObject]; 
    } 

    ((SimpleTextFieldTableCell *)cell).textField.delegate = self; 
    ((SimpleTextFieldTableCell *)cell).textField.tag = indexPath.row; 
    ((SimpleTextFieldTableCell *)cell).textField.text = [self.tags objectAtIndex:indexPath.row]; 
    [((SimpleTextFieldTableCell *)cell).textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
} 

- (void)textFieldDidChange:(id)sender 
{ 
    UITextField *textField = sender; 

    [self.tags replaceObjectAtIndex:textField.tag withObject:textField.text]; 
    if (textField.text.length == 1) 
    { 
     [textField setNeedsDisplay]; 
     [self addTagsCell]; 
    } 
} 

- (void)addTagsCell 
{ 
    NSString *newTag = @""; 
    [self.tags addObject:newTag]; 

    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:self.tags.count - 1 inSection:1]; 
    [self.tableView beginUpdates]; 
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationBottom]; 
    [self.tableView endUpdates]; 
} 
+0

Est-ce que le champ de texte est vide si vous commentez l'insertion? – TahoeWolverine

+0

Non, le champ de texte conserve le texte saisi s'il n'y a pas d'insertion. C'est seulement quand une cellule est insérée que le texte disparaît. –

+0

tagCellIdentifier ci-dessus est défini sur "SimpleTextFieldTableCell" qui est l'identifiant que j'ai configuré pour la cellule dans Interface Builder. –

Répondre

0

La seule chose que je peux penser ici est que peut-être lorsque vous insérez une ligne de la vue totale de la table est rechargée, si vous n'avez pas ajouté votre portable correctement à la file d'attente de cellules, ils ne reviendrons pas dans l'état où ils étaient, donc vous voyez des cellules vides à la suite de l'insertion, juste une supposition, j'espère que cela aide.

+0

J'utilise une cellule créée avec le constructeur d'interface pour qu'elle ne soit pas exécutée dans le initWithStyle: reuseIdentifier. Cela pourrait-il être un problème? –

+0

Je viens de vérifier et l'identifiant que j'utilise pour déquiler la cellule est le même que celui que j'ai assigné à la cellule dans IB. –

+0

utilisez-vous le même identifiant pour toutes vos cellules? cela causera des problèmes – Daniel

0

mise à jour rapide:

ne devrait pas importer, mais je remarque que vous ne avez pas besoin:

[self.tableView beginUpdates] 
[self.tableView endUpdates] 

puisque vous effectuez une opération. Je ne sais pas si cela compte (ça ne devrait pas).


Mise à jour:

Je aurais dû dire que ces questions sont assez communs. Voici un poste lié à votre question

http://www.bdunagan.com/2008/12/08/uitextview-in-a-uitableview-on-the-iphone/

En outre, d'autres ont abstraire cela. Plus précisément, je l'ai essayé sans ces questions:

http://furbo.org/2009/04/30/matt-gallagher-deserves-a-medal/

Vous pouvez utiliser: http://github.com/joehewitt/three20/

Mais il a un peu d'une courbe d'apprentissage.

Une autre question Stackoverflow attaquer à ce problème:

Editing a UITextField inside a UITableViewCell fails

Excusez-moi de ne pas répondre à votre question directement, mais je pense que la solution pourrait être contenue dans un de ces liens.


Réponse d'origine:

Essayez:

[newTextField setNeedsDisplay]; 

Parfois, les tableviews peut être "collant" avec la mise à jour du contenu UITextView/UITextField.

Si cela ne fonctionne pas, assurez-vous que le support est également correctement mis à jour. Vous n'avez pas affiché de code indiquant que vous avez mis à jour le modèle (bien que je suppose que vous l'avez fait, sinon il aurait probablement levé une exception).

+0

J'ai essayé d'appeler setNeedsDisplay en vain. J'ai ajouté les implémentations de méthode à mon message original, y compris les mises à jour du modèle. –

+0

Ah, je pense que vous avez raison sur les appels beginUpdates et endUpdates. Je pensais que l'animation ne se produisait que si la méthode insert rows était appelée à l'intérieur, mais il semble que ce soit juste pour les groupes d'insertions et de suppressions. C'est bizarre, puisque UITextField dans UITableViewCell fonctionne correctement. Aucun problème du tout. C'est juste l'insertion d'une cellule dans un événement changé UITextField qui cause le problème. Il est amusant de mentionner Three20. Je suis en train de l'utiliser pour la majorité de cette application. Il y avait des endroits où la création manuelle de la table avait plus de sens, ceci étant l'un d'entre eux. –

Questions connexes