Tratando de encontrar qué campo de text está activo ios

Estoy tratando de encontrar qué campo de text está activo para cuando muevo la vista cuando el keyboard se levanta. Estoy tratando de establecer una propiedad en mi viewcontroller desde la subview de una vista de desplazamiento.

Este es el código que uso para mostrar la vista en scrollview

-(void)displayView:(UIViewController *)viewController{ [[viewFrame subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; [viewFrame scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; [viewFrame addSubview: viewController.view]; _currentViewController = viewController; } 

–EDITAR–

He cambiado mi forma de pensar sobre este problema. Perdón por la ambigüedad de la pregunta cuando la publiqué. Estaba exhausto en ese momento y tenía sentido en mi cabeza.

Una pregunta diferente pero similar: ¿hay una subclass común de UITextArea y UITextView que me dé el origen del primer respondedor? ¿O tendré que verificar también la class del primer respondedor antes de que pueda encontrar el origen?

Necesita search un object que se haya convertido en un primer respondedor. El primer object de respuesta es el que usa el keyboard (en realidad, es el que tiene un foco para la input del usuario). Para verificar qué campo de text utiliza el keyboard, itera sobre los campos de text (o simplemente sobre todas las subvistas) y usa el método isFirstResponder .

EDITAR: como se solicita, un código de ejemplo, suponiendo que todos los campos de text son una subvista de la vista del controller de vista:

 for (UIView *view in self.view.subviews) { if (view.isFirstResponder) { [self doSomethingCleverWithView:view]; } } 

Hice una extensión para eso.

 public extension UIResponder { private struct Static { static weak var responder: UIResponder? } public static func currentFirst() -> UIResponder? { Static.responder = nil UIApplication.shanetworking.sendAction(#selector(UIResponder._trap), to: nil, from: nil, for: nil) return Static.responder } @objc private func _trap() { Static.responder = self } } 

Utilizar:

 if let activeTextField = UIResponder.currentFirst() as? UITextField { // ... } 

suponiendo que sus campos de text son todos iguales (es decir, toda la moneda o el text) y no requieren ningún formatting especial, sugiero lo siguiente:

Primero, tiene una variable textField opcional. Por ejemplo:

 var currentTextField: UITextField? 

A continuación, agregue lo siguiente:

 func textFieldDidBeginEditing(textField: UITextField) { currentTextField = textField } 

Ahora puede hacer lo que quiera con el campo de text 'activo' y no necesita rastrear ninguna label a less que necesite alguna operación de formatting específica.

¿Por qué no das a todos los UITextfields tags individuales textfield.tag = 1

entonces respondes al delegado DidBeginEditing. y verifique qué textfield.tag está activo?

En swift 3 usa la function a continuación en tu function if else statements:

  if (textField.isEditing) 

[iOS] [swift3]

Primero utilicé la solución de Xilexio pero fue lenta. Terminé usando tags. Aquí está mi código y configurado como un ejemplo.

 @property (nonatomic) NSInteger currentFormField; typedef NS_ENUM(NSInteger, IOUFormField) { IOUFormFieldName, IOUFormFieldAmount, IOUFormFieldDescription, IOUFormFieldDate }; 

 self.nameField.tag = IOUFormFieldName; self.amountField.tag = IOUFormFieldAmount; self.descriptionField.tag = IOUFormFieldDescription; self.dateField.tag = IOUFormFieldDate; -(void)keyboardWillShow:(NSNotification *)notification { // Move the scroll view to a position where the user can see the top and bottom form fields // For example, if the user is on the description field, they should be able to see the date field and the amount field. // The keyboard rect value comes as a NSValue * (a wrapped NSRect) with origin and size. // The origin is using screen coordinates which is pixel based so don't use it. // Use the size. Seems like it is density based. CGFloat viewableScreenHeight = self.view.frame.size.height - keyboardFrameBeginRect.size.height; // When the user is on a form field, get the current form field y position to where the scroll view should move to CGFloat currentFormFieldYPosition = 0; switch (self.currentFormField) { case IOUFormFieldName: { currentFormFieldYPosition = self.nameField.frame.origin.y; // If the scroll view is at the bottom and the user taps on the name field, move the scroll view to the top. // This is so that users can see the give/get segments. [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; break; } case IOUFormFieldAmount: { currentFormFieldYPosition = self.amountField.frame.origin.y; break; } case IOUFormFieldDescription: { currentFormFieldYPosition = self.descriptionField.frame.origin.y; break; } case IOUFormFieldDate: { currentFormFieldYPosition = self.dateField.frame.origin.y; break; } default: break; } // I want the current form field y position to be 100dp from the keyboard y position. // 50dp for the current form field to be visible and another 50dp for the next form field so users can see it. CGFloat leftoverTopHeight = viewableScreenHeight - 100; // If the current form field y position is greater than the left over top height, that means that the current form field is hidden // We make the calculations and then move the scroll view to the right position if (currentFormFieldYPosition > leftoverTopHeight) { CGFloat movedScreenPosition = currentFormFieldYPosition - leftoverTopHeight; [self.scrollView setContentOffset:CGPointMake(0, movedScreenPosition) animated:YES]; } } #pragma mark - UITextFieldDelegate - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { switch (textField.tag) { case IOUFormFieldName: self.currentFormField = IOUFormFieldName; break; case IOUFormFieldAmount: self.currentFormField = IOUFormFieldAmount; break; case IOUFormFieldDescription: self.currentFormField = IOUFormFieldDescription; break; case IOUFormFieldDate: self.currentFormField = IOUFormFieldDate; default: break; } return true; } 

Avíseme si tiene alguna pregunta y lo aclararé. Tenga en count que los comentarios son para mí. También tenga en count que algún código u omitió la brevedad.

Basado en la respuesta de Xilexio, pero iterando sobre todas las vistas para encontrar la Vista solicitada de FirstResponder

 -(UIView*)getFirstResponderInView:(UIView*)parentView{ UIView* requestedView = nil; for (UIView *view in parentView.subviews) { if (view.isFirstResponder) { [view resignFirstResponder]; } else if (view.subviews.count > 0) { requestedView = [self getFirstResponderInView:view]; } if (requestedView != nil) { return requestedView; } } return nil; } 

Usado así:

 UIView *view = [self getFirstResponderInView:self.view]; if(view != nil){ [self doSomethingCleverWithView:view]; }