UITextFieldDelegate problème

J'ai une application iPad utilisant le protocole UITextFieldDelegate. Je déclare et implémente le protocole complet. Le champ appelant ce protocole est déclaré comme suit:

typingInput = [ [ [ UITextField alloc ] initWithFrame: textIn ] retain ]; dp.x = center.x; dp.y = center.y - 42; typingInput.center = dp; [ self addSubview: typingInput ]; [ typingInput release ]; typingInput.font = [ UIFont systemFontOfSize: 52.0 ]; [ typingInput setTextColor: [ UIColor whiteColor ] ]; typingInput.backgroundColor = [ UIColor colorWithWhite: 0.0 alpha: 0.0 ]; typingInput.alpha = 0.0; typingInput.userInteractionEnabled = NO; [ typingInput addTarget: self action: @selector(textField:shouldChangeCharactersInRange:replacementSsortingng:) forControlEvents: UIControlEventEditingChanged | UIControlEventAllEditingEvents ]; typingInput.text = @""; typingInput.autocorrectionType = UITextAutocorrectionTypeNo; typingInput.enablesReturnKeyAutomatically = YES; typingInput.delegate = self; 

Le problème est avec

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: (NSRange)qrange replacementSsortingng: (NSSsortingng *)str; 

Sur le simulateur, le type d'exécution de 'str' est soit nul soit NSCFSsortingng selon ceci:

 NSLog(@"class = %@, value='%@'", [ str class ], str ); 

Tout fonctionne bien quand je modifie la string.

Sur l'iPad, la même instruction de journalisation renvoie:

 class = UIFieldEditor, value='<UIFieldEditor: 0xb5f400; frame = (0 0; 640 640); text = 'Foobar'; opaque = NO; layer = <UIWebLayer: 0x113ba0>>' 

Les utilisations ultérieures de 'str' en tant que NSSsortingng provoquent un crash sur l'iPad lorsque j'essaie d'append, de modifier ou de supprimer du text. qrange est également invalide (la longueur est un nombre énorme).

UIFieldEditor fait partie de UIWebView.h que je n'utilise pas.

Dans une certaine mesure, la modification de la déclaration des membres du protocole affecte le comportement.

Puisque je ne peux pas find quelqu'un d'autre avec ce problème, je dois supposer que je fais quelque chose de mal.

Des idées?

La méthode de délégation shouldChangeCharactersInRange sera automatiquement appelée par UITextField (en ayant défini sa propriété delegate ). UITextField peut également appeler d'autres methods de délégué si vous les avez implémentées.

Vous ne devez pas (et ne devez pas) connecter explicitement les methods déléguées à un événement addTarget aide de addTarget . Cela entraînera l'appel de la méthode déléguée deux fois (une fois définie par le protocole et une seconde par votre addTarget).

En connectant (à tort) un événement UIControl à cette méthode, il est appelé avec des parameters qui ne correspondent pas aux parameters de la méthode. Les methods de gestion d'events UIControl (que shouldChangeCharactersInRange ne possède pas) ont les forms suivantes:

 - (void)methodName; - (void)methodName:(id)sender; - (void)methodName:(id)sender withEvent:(UIEvent *)event; 

Voir Cocoa Target-Action et iPhone App Development Lecture 4 pour plus de détails.

Supprimez la ligne addTarget à corriger.


Séparément:

  • ne met pas l'alpha à 0.0 rendant le contrôle invisible?
  • pourquoi userInteractionEnabled est-il défini sur NO?
  • Appeler explicitement conserver, appeler addSubView, appeler la version, puis définir les propriétés (même si cela fonctionne) n'est pas la manière habituelle de faire les choses. Supprimez la retenue et déplacez addSubView et relâchez jusqu'à la fin.