¿Cuáles son las mejores prácticas para autocompletar en UITextField?

Si su principal preocupación es cómo evitar hacer demasiadas solicitudes HTTP cuando el usuario ingresa la entrada, entonces mi recomendación es evitar capturar eventos directamente en el UITextField (utilizando los métodos delegados) y, en su lugar, usar un NSTimer que verifique cada N segundos si El contenido del campo de texto ha cambiado desde la última comprobación. Inicie el temporizador cuando el usuario ingrese a la vista y deténgalo cuando el usuario salga de él.

En viewController.h:

@property (nonatomic, retain) NSTimer *timer; @property (nonatomic, retain) NSString *savedText; - (void)autocompleteTextField; 

En viewController.m:

 static NSTimeInterval const kTextFieldCheckInterval = 0.25; @implementation ViewController @synthesize timer; @synthesize savedText; - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.savedText = @""; self.timer = [NSTimer timerWithTimeInterval:kTextFieldCheckInterval target:self selector:@selector(autocompleteTextField) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [self.timer invalidate]; } - (void)autocompleteTextField { if (![self.savedText isEqualToString:self.textField.text]) { self.savedText = self.textField.text; // Perform your autocompletion here } } @end 

¡Y tu estas listo! Por supuesto, la mayor parte del trabajo involucrado aquí es asegurarse de que la llamada HTTP y la actualización de la interfaz de usuario se ejecuten sin problemas (y lo suficientemente rápido como para que sea realmente útil para el usuario).

Otra cosa que podría considerar hacer es guardar los objetos de solicitud y cancelar todas las solicitudes HTTP, excepto la más reciente si se instancia más de una. De esa manera, nunca actualizará la interfaz de usuario con resultados rezagados.

Dependiendo del volumen de las cadenas de búsqueda (supongo que no es demasiado grande ya que probablemente solo desee completar automáticamente opciones razonables, por ejemplo, una base de datos de productos) podría obtener toda la tabla de cadenas de búsqueda en una sola llamada, haga todo el trabajo de visualización en el dispositivo (la potencia informática definitivamente no es el problema aquí). Para volúmenes de cadena de búsqueda más grandes, la solución de Dan parece razonable.

Puede activar su función de solicitud cuando está en estado inactivo de escritura utilizando:

 [NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(yourRequestFunction) object:nil]; [self performSelector:@selector(yourRequestFunction) withObject:nil afterDelay:yourInterval]; 

Aquí está mi ejemplo:

 - (void)setupTextField { [self.searchTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; } - (void)textFieldDidChange:(id)sender { [NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(searchSomething) object:nil]; [self performSelector:@selector(searchSomething) withObject:nil afterDelay:0.5]; } 

En ese código, la función “searchSomething” se activará después de escribir cosas y luego se detendrá durante 0,5 segundos. La función solo se disparará una vez.

More Interesting

¿Cómo puedo silenciar un mensaje grupal de iOS?

¿Cómo se puede encontrar un desarrollador móvil experimentado en los Estados Unidos?

¿Es posible hacer una aplicación que 'esclava' a otra aplicación en Android o iOS, creando efectivamente una capa API adicional?

¿No tendría sentido que Apple lance un iOS para dispositivos que no sean de Apple, vendiendo así más aplicaciones?

¿Debería pagarle a mi empresa de desarrollo por la etapa de desarrollo previo de la aplicación (wireframes) cuando podría hacerlo yo mismo con un programa disponible en Internet?

¿Es excesivo combinar New Relic con Raygun o Crashlytics en mi aplicación iOS?

Cómo instalar la versión beta de iOS 11

¿Existe una herramienta para generar capturas de pantalla de la App Store para iPhone y iPad de forma gratuita (como cualquier plantilla de Adobe Photoshop)?

¿Cuáles son los consejos para los desarrolladores de Android que aprenden el desarrollo de iOS?

¿Está Objective-C 'más cerca del metal' que Swift?

¿Dónde puedo encontrar un desarrollador experimentado de aplicaciones iOS / Android para crear una aplicación para mí? Estoy en el Área de la Bahía y sé que hay muchos de ellos, pero no conozco ningún desarrollador a nivel personal. Estoy buscando un socio en el que pueda confiar.

¿Por qué la interfaz de usuario de iOS se ve más pulida y premium que Android?

¿Puede la programación de flutter hacer algo que Swift u Objective-C pueden hacer, o existen limitaciones?

¿Qué deben saber los desarrolladores de Swift sobre Objective-C?

¿El soporte para iOS en Xojo 2016R2 ahora es lo suficientemente bueno como para dejar Xcode? ¿Y por qué harías eso?