2012-05-26 967 views
20

Lo que intento hacer es crear algo similar a la función de búsqueda "buscar en la página" en Safari en iPad.Dejar la entrada AccessAccessoryView visible después de que se descarte el teclado

Estoy usando un UIToolbar con algunos elementos y lo até al teclado configurándolo como inputAccessoryView en el UITextField. Funciona como un encanto, pero hay una cosa que no puedo entender. En Safari, cuando busca algo, el teclado desaparece pero la barra de herramientas permanece en la parte inferior de la pantalla.

¿Alguien tiene una pista sobre cómo lograr esto? La única solución en la que puedo pensar es responder a un evento de teclado descartado y luego sacar el UIToolBar y crear una animación personalizada que lo mueva a la parte inferior de la pantalla. Pero esto es hacky. Estoy buscando una solución más elegante. Algo que me puede hacer decidir qué hacer con la vista de accesorios de entrada cuando se descarta el teclado.

Respuesta

41

Se hace así:

asignar su UIToolbar a una propiedad en su controlador de vista :

@property (strong, nonatomic) UIToolbar *inputAccessoryToolbar; 

En el controlador de vista superior, añadir estos métodos:

- (BOOL)canBecomeFirstResponder{ 

    return YES; 

} 

- (UIView *)inputAccessoryView{ 

    return self.inputAccessoryToolbar; 

} 

Y luego (opcionalmente, ya que por lo general no debería ser necesario), siempre que el teclado se oculta, simplemente llame a:

[self becomeFirstResponder]; 

esta manera, su inputAccessoryToolbar habrá tanto de entrada como de su controlador de vista y la vista de texto de vista de accesorios.

+2

Ojalá pudiera dar tus puntos de recompensa por esto – zekel

+1

Esto es genial aquí – Adolfo

+1

Parece que no funciona en iOS8, Obtengo UIViewControllerHierarchyInconsistency, any ideas? – MegaManX

7

he terminado con UIToolBar que no está asignado como vista accesorio de entrada, y se deslizan hacia arriba y hacia abajo en UIKeyboardWillShowNotification/UIKeyboardWillHideNotification

+0

Gracias, supongo que esta es la única manera de ir de hecho. –

+1

Esto es lo que estoy haciendo actualmente también, había venido aquí esperando que hubiera otra solución. Supongo que no :( –

+1

@BradMoore, hay otra solución. Por favor revisa mi respuesta – arik

2

adición a la respuesta de @ Arik, aquí está la versión Swift:

class ViewController: UIViewController { 

    @IBOutlet var textField: UITextField!  

    // Input Accessory View 
    private var inputAccessoryToolbar: UIToolBar? 
    override func canBecomeFirstResponder() -> Bool { 
    return true 
    } 
    override var inputAccessoryView: UIView? { 
    return inputAccessoryToolbar 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    inputAccessoryToolbar = UIToolbar(frame: CGRectMake(0, 0, view.frame.size.width, 50)) 
    textField.inputAccessoryView = inputAccessoryToolbar 
    } 

    // UITextFieldDelegate 
    func textFieldShouldReturn(textField: UITextField) -> Bool { 
    becomeFirstResponder() 
    return true 
    } 
} 

Gracias por la solución limpia!

+0

En Swift 3/4, 'canBecomeFirstResponder' y' inputAccessoryView' ahora son propiedades en lugar de funciones/métodos. – Annjawn

0

Actualice a Swift 4, en función de las respuestas anteriores. Si se agrega la barra de herramientas a través de storyboards puede hacerlo

class ViewController: UIViewController { 

    @IBOutlet weak var textField: UITextField! 
    @IBOutlet var toolbar: UIToolbar! 

    override var canBecomeFirstResponder: Bool { 
     get { 
      return true 
     } 
    } 

    override var inputAccessoryView: UIView { 
     get { 
      return self.toolbar 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     textField.inputAccessoryView = toolbar 
    } 
} 

En este caso, siempre que renuncie campo de texto primicias de respuesta, que por defecto el primero en responder a la vista principal. Tenga en cuenta que es posible que desee renunciar explícitamente a la primera respuesta y establecer la vista principal como primera respuesta si hay múltiples elementos de la IU y la respuesta del primer respondedor es una vista no deseada después de la renuncia.

Cuestiones relacionadas