UITextFieldDelegate de UITextFields aninhados não sendo chamados
-
27-10-2019 - |
Pergunta
Eu tenho uma subclasse de um UIView
(MyView) que possui algum UITextField
como subvisualizações.MyView implementa o protocolo UITextFieldDelegate
para ser notificado quando os campos de texto forem clicados.Isso estava funcionando bem.Agora preciso colocar os campos de texto em uma espécie de "contêiner" para poder entrar e sair gradualmente desse contêiner (e de todos os seus filhos) com uma animação UIView
.Então criei um UIView (MySubview), tornei-o uma subview de MyView e coloquei todos os campos de texto dentro dela.A animação funciona bem, mas o UITextFieldDelegate
não é mais chamado.Acho que é porque os textfields não são mais filhos diretos de MyView.
Existe alguma outra maneira de lidar com isso?
ATUALIZAÇÃO
Fiz uma pequena versão do meu código, talvez isso ajude a encontrar o problema:
@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;
}
Solução 2
Responderei minha própria pergunta caso alguém tenha o mesmo problema - embora seja difícil imaginar alguém cometendo um erro tão bobo:
Eu estava configurando a moldura do contêiner de rótulos para self.bounds.Mas o MyViewController estava criando MyView com um frame de CGRectZero!Fiz essa alteração para oferecer suporte à animação ao mesmo tempo em que adicionei o contêiner.Portanto, pensei que o problema tinha a ver com a hierarquia de visualizações.Que vergonha!!!
De qualquer forma, obrigado a todos os ajudantes, especialmente a Madhumal Gunetileke que, com sua resposta, me fez assistir em uma direção diferente.
Outras dicas
Ok, tentei escrever o seu código e funcionou para mim.Aqui estão alguns itens que você pode tentar alterar;
- O motivo pelo qual você não pode editar seu textField é porque está retornando NÃO ao método textFieldShouldBeginEditing.Altere para SIM.
- Tente posicionar (se possível) seu textField um pouco abaixo do que você forneceu.Além disso, 20px é muuuito pequeno para um textField adequado, faça com que seja pelo menos 40px.Um textField de 20px posicionado em 0,0 pode ficar totalmente oculto se a barra de status estiver ativada no telefone.
- Defina um borderStyle para seu textField.Pelo que eu sei, isso é importante para um textField aparecer e interagir bem.(por exemplo, textField.borderStyle= UITextBorderStyleRoundRect)
Dedos cruzados!:)