es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

UITextView en InputAccessoryView no se convierte en el primer respondedor (el teclado no aparece inicialmente)

Estoy tratando de implementar una vista de accesorios de entrada que funcione como la aplicación Messages en iOS. He buscado casi todas las preguntas de SO relacionadas con este tema, pero no pude encontrar la solución que funcionara para mí.

Aquí está el código mínimo reproducible que creé, refiriéndome a esta publicación de SO.

import UIKit

class TestViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white
    becomeFirstResponder()  // parece innecesario
}

override var inputAccessoryView: UIToolbar {
    return self.keyboardAccessory
}

override var canBecomeFirstResponder: Bool {
    return true
}

var textView: UITextView = {
    let view = UITextView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .yellow
    return view
}()

lazy var keyboardAccessory: UIToolbar = {
    let inputAccessory = UIToolbar(frame: .init(x: 0, y: 0, width: 0, height: 100))
    inputAccessory.addSubview(textView)
    NSLayoutConstraint.activate([
        textView.centerXAnchor.constraint(equalTo: inputAccessory.centerXAnchor),
        textView.centerYAnchor.constraint(equalTo: inputAccessory.centerYAnchor),
        textView.widthAnchor.constraint(equalToConstant: 200),
        textView.heightAnchor.constraint(equalToConstant: 50)
    ])
    inputAccessory.backgroundColor = .gray
    return inputAccessory
}()
}

Cada artículo que he visto sugiere anular inputAccessoryView y canBecomeFirstResponder, y eso es todo. Sin embargo, el teclado no aparece hasta que toco el textView.

¿Alguien puede decirme qué me falta?

Editar

Como señaló @DonMag, la aplicación Messages en iOS no muestra el teclado automáticamente. Por favor, considere la siguiente interfaz de usuario en Facebook en su lugar.

Cuando presiono el botón de comentario, cambia a otra vista mientras se muestra el teclado. El efecto de transición no tiene que ser exactamente el mismo, pero quiero que el teclado se cargue completamente dentro del controlador de vista presentado, como si llamara a becomeFirstResponder() en viewDidLoad.

Imagen

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con el código proporcionado es que el textView no se establece como el primer respondedor, lo cual es necesario para mostrar el teclado. Para solucionar esto, puedes agregar una llamada a textView.becomeFirstResponder() dentro del método viewDidLoad() después de agregarlo a inputAccessoryView:

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        textView.becomeFirstResponder()
    }
    

    Esto hará que el teclado aparezca automáticamente cuando se cargue la vista, al igual que en la aplicación de Mensajes.

Comments are closed.