tornar-sePrimeiroResponder:role automaticamente para o UIControl que se torna o socorrista
-
15-11-2019 - |
Pergunta
eu tenho um agrupado UITableViewController
com uma seção e muitas linhas.Cada cell
consiste em dois elementos:a UILabel
com uma descrição e um UITextField
para uma entrada.Uma forma, eu diria.
Na parte inferior há um botão "Avançar" para ir para a próxima visualização.Mas antes disso, eu valido o UITextField
de:caso o usuário não tenha preenchido algum campo, este campo deverá receber o foco, para que o usuário veja que precisa inserir algo.Eu tentei com isso:
[inputField becomeFirstResponder];
Lembre-se, o botão que apertei é no fundo do meu ponto de vista e imagino que o UITextField
é no topo.Nessa situação o campo não consegue o foco porque está muito distante.Agora, quando eu rolar para cima lentamente e o campo ficar visível, o campo se tornará o primeiro respondente e receberá o cursor :-) Conclusão:O becomeFirstResponder
funcionou, mas não faz exatamente o que eu queria.Não quero rolar para cima com o dedo, o campo deve ficar em foco e ficar visível automaticamente.
Existe alguma maneira de "pular" diretamente para o meu campo?Use uma alternativa para becomeFirstResponder
?Rolar para meu campo automaticamente?
Obrigado pela ajuda!
Solução
Se você conhece o índice da célula com o UITextField que deseja editar, use
NSIndexPath* indexPath = [[NSIndexPath indexPathWithIndex:your_section_index] indexPathByAddingIndex:your_cell_index];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]
antes de ligar becomeFirstResponder
.
Se o celular estiver fora da tela, o BecomeFirstResponder pode falhar em algumas versões do iOS.Além disso, algumas versões realizarão rolagem adicional na tableview em algumas situações (por exemplo,se o código da Apple determinar que o respondedor ainda estaria fora da tela sem rolar mais).Para contornar esses problemas, pode ser necessário ligar para o socorrista após a conclusão da animação de rolagem.
Outras dicas
Eu tive o mesmo problema. é devido ao UIAnimation ocorrer para as duas tarefas simultaneamente.Portanto, embora o UIAnimation para scrollToRowAtIndexPath ignore o BecomeFirstResponder .
A solução pode ser desative o efeito de animação um deles OU senão usando o performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:1.0f];
.