UITextFieldDelegate de UITextFields imbriquées pas appelé
-
27-10-2019 - |
Question
J'ai une sous-classe d'un UIView
(MyView) qui a une certaine UITextField
comme subviews. MyView implémente le protocole UITextFieldDelegate
afin d'être averti lorsque les champs de texte sont cliqués. Ce fonctionnait bien. Maintenant, je dois placer les champs de texte dans une sorte de « conteneur » pour pouvoir disparaître et ce récipient (et tous ses enfants) avec une animation UIView
. Donc, j'ai créé un UIView (MySubview), fait de sous-vue MyView et placé tous les champs de texte à l'intérieur de celui-ci. L'animation fonctionne très bien, mais le UITextFieldDelegate
ne soit pas appelé plus. Je pense qu'il est parce que les champs de texte ne sont pas les enfants directs de MyView plus.
Y at-il d'autres façons de régler ce problème?
UPDATE
J'ai fait une petite version de mon code, peut-être cela aide à trouver le problème:
@interface MyView : UIView <UITextFieldDelegate>
@implementation MyView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// This is MySubview:
UIView *tempLabelsContainer = [[UIView alloc] initWithFrame:self.bounds];
[tempLabelsContainer setUserInteractionEnabled:YES];
[self addSubview:tempLabelsContainer];
self.labelsContainer = tempLabelsContainer;
[tempLabelsContainer release];
UITextField *aTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
[aTextField setBackgroundColor:[UIColor clearColor]];
[aTextField setText:@"Some text"];
[aTextField setTag:1];
[aTextField setDelegate:self];
[self.labelsContainer addSubview:aTextField];
[aTextField release];
// More labels are being added
}
return self;
}
#pragma mark - UITextFieldDelegate methods
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
// This is not being called
NSLog(@"TextField with the tag: %d should be edited", [textField tag]);
return NO;
}
La solution 2
Je vais répondre à ma propre question juste au cas où quelqu'un arrive à avoir ce même problème - difficile d'imaginer quelqu'un qui fait cette erreur stupide, si:
I mettait le châssis du conteneur d'étiquettes à self.bounds. Mais le MyViewController a été la création MyView avec un cadre de CGRectZero! Je l'ai fait ce changement à l'animation de soutien en même temps j'ai ajouté le récipient. Par conséquent, je pensais que le problème avait à voir avec la hiérarchie de la vue. Honte sur moi!!!
Quoi qu'il en soit, merci à tous, en particulier des aides à Madhumal Gunetileke qui, avec sa réponse, m'a fait regarder dans une autre direction.
Autres conseils
Ok, je pris un essai écrit votre code, et cela fonctionne pour moi. Voici quelques articles que vous pouvez essayer de changer;
- La raison pour laquelle vous ne pouvez pas modifier votre textField est parce que vous revenez NON à la méthode textFieldShouldBeginEditing. Sélectionner OUI.
- Essayez de positionnement (si possible) votre textField un peu en dessous de ce que vous avez donné. En outre, 20px est de toute façon waaaaay trop petit pour un textField bon, faire au moins 40px. Un 20px textField positionné à 0,0 peut-être tout à fait caché si la barre d'état est activée dans le téléphone.
- Définissez un borderStyle pour votre textField. Pour autant que je sache, ce qui est important pour un textField pour montrer et Interagir bien. (Par exemple textField.borderStyle = UITextBorderStyleRoundRect)
Je croise les doigts! :)