2008-12-17 5 views
24

Dans ma demande, j'ai un UITextField dans un UITableViewCell. Si je clique dans le champ de texte et que j'ajoute du texte, je trouve que si j'essaie de déplacer le point d'insertion, cela fonctionne la première fois mais échoue lors des tentatives suivantes. Je suis complètement incapable de déplacer la sélection; aucune "loupe" n'apparaît.Modification d'un UITextField dans un UITableViewCell échoue

Encore plus curieux, ce "réglage" semble permanent jusqu'à ce que je redémarre l'application. Et cela affecte tous les UITextFields sur cet écran et pas seulement celui que j'ai essayé à l'origine d'éditer.

Si vous voulez voir vous-même, essayez de l'échantillon « UICatalog » qui vient avec le SDK iPhone. Cliquez sur "champs de texte", puis "modifier" et jouer avec les zones de texte.

J'ai fait beaucoup de recherches là-dessus, mais c'est très difficile pour Google! Les meilleures références que j'ai trouvées sont sur Apple's support board et MacRumors formum (les deux référence une solution qui apparemment fonctionnait sur l'iPhone 2.0 mais ne fonctionne pas avec des versions contemporaines - j'ai essayé).

Mon sentiment est que ce bogue dans le système d'exploitation, mais je pensais que je jetterais ceci à la foule SO pour un deuxième avis et de voir s'il y a des solutions de contournement. Des idées?

Suite à la suggestion de benzado, j'ai essayé de construire mon application en utilisant les SDK 2.0, 2.1 et 2.2. J'ai le même comportement dans toutes les versions. (En fait, quelque chose lié, mais pas le même brisé en 2.2, mais qui est probablement une autre question!)

Répondre

12

J'ai passé beaucoup de temps là-dessus mais je pense finalement que je l'ai cloué.

L'astuce est que la table doit être modifiable (c'est-à-dire que sa propriété editing doit être définie sur YES). Les bonnes nouvelles sont que vous êtes maintenant en mesure de déplacer le point d'insertion. Parfois, la loupe n'apparaît pas ou suit, mais votre geste semble toujours fonctionner.

Est-ce que cela est toujours considéré comme un bug? Peut-être. À tout le moins, la documentation du SDK d'Apple devrait être mise à jour. J'ai soulevé un rapport de bug avec Apple pour couvrir ceci (rdar: // 6462725).

+0

Wow, je viens de remarquer le même problème dans mon application. J'ai essayé votre tour et ça marche maintenant bien, merci! En outre, j'ai dû faire tableView: canEditRowAtIndexPath: et tableView: canMoveRowAtIndexPath: retourner NO, de sorte que la table ne ressemble pas en mode édition! – squelart

+0

Merci à vous deux pour cette solution –

+0

UITableView n'a pas de propriété éditable, seul UITextField fait ... vous parlez de la propriété/editing/sur UITableView? ou est-ce sur UITableViewCell? –

0

Cela ressemble à un bug du système d'exploitation. Je vais essayer de le reproduire en exécutant l'exemple UICatalog sur les SDK 2.0, 2.1 et 2.2 pour voir si quelque chose change. (Il y a un bogue lié à l'alignement du texte de la cellule qui se produit si vous construisez pour 2.2 mais pas si vous construisez pour 2.1, quelle que soit la version du système d'exploitation.)

S'il s'avère que cela fait une différence , https://bugreport.apple.com/

+0

Merci pour les suggestions. Je vais certainement essayer de construire avec différentes versions du SDK. J'avais supposé que c'était la version de l'OS que le code fonctionnait, mais bien sûr, quand vous assumez ... –

0

J'ai essayé avec ma demande et il semble fonctionner comme prévu. Je reçois une loupe à chaque fois. J'utilise le SDK 2.1.

+0

Intéressant. Alors, en quoi votre utilisation de UITableView, UITableViewCell et UITextField diffère-t-elle de celle de l'exemple UICatalog? –

2

Grâce à cet article, j'ai réussi à faire en sorte que cela fonctionne correctement dans mon application.

Quelque chose à ajouter, cependant:

Si vous définissez votre table pour être modifiable, vous aurez probablement obtenir un comportement différent de celui que vous attendez (indenter, widgets d'édition, aucun indicateur d'information, etc.).Cela m'a surpris, mais voici comment mieux y faire face:

Dans votre délégué UITableView, mettre en œuvre:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

Ensuite, dans votre implémentation de UITableViewCell, définissez votre UITableView être modifiable uniquement lorsque vous modifiez réellement :

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    ((UITableView *)[self superview]).editing = YES; 
... 
} 

et édition désactiver lors de l'édition se fait:

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
... 
    ((UITableView *)[self superview]).editing = YES; 
} 

Cela garantira que votre table n'est pas en mode d'édition lorsque vous ne modifiez pas la cellule, pour que tout fonctionne correctement.

Merci!

Brian M. Criscuolo Mark/Space Inc.

2

La réponse par Brian M. Criscuolo est le plus proche, mais son pas encore tout à fait raison - dans mon utilisation de SDK2.2.1 je trouve que je dois faire les éléments suivants:

Pour votre UITableViewDelegate (ce qui est souvent votre UITableViewController) ajouter à la fois des éléments suivants:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

et:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewCellEditingStyleNone; 
} 

et:

- (void)viewDidLoad { 
[super viewDidLoad]; 

    // do any other customisation here 
self.uiTableView.editing = true; 
} 

Si vous ne mettez pas les deux méthodes de délégués de haut niveau, ce qui précède faire les icônes de suppression à côté de chaque ligne, et l'empreinte de chaque ligne. Vous ne devriez pas avoir à faire quoi que ce soit avec les délégués de champs de texte comme Brian l'a indiqué (sauf si vous avez plusieurs lignes et que vous voulez répondre à un événement didSelectRowAtIndexPath: que vous ne semblez pas obtenir en mode édition - alors vous devra aussi faire comme il le suggère).

Par ailleurs - cela semble fixé dans SDK3.0 (bien que sujet à changement, je suppose)

0

fait ce qui fonctionne le mieux semble être de mettre la table propriété « édition » true dans « viewDidLoad » et en ajoutant ceux-ci au délégué de la table

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

vous n'avez pas besoin de quoi que ce soit dans le délégué du champ de texte