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.

Enviar el texto del campo de texto desde dentro de una tabla a un botón externo.

Tengo una tabla con un campo de texto dentro de ella. Quiero enviar lo que el usuario escribe al hacer clic en un botón. Pero el botón no está dentro de la tabla.

Así que utilicé esta función simple para pasar el texto del campo de texto a esta variable:

extension TableViewCell: UITextFieldDelegate {

func textFieldDidChangeSelection(_ textField: UITextField) {
    amountFromCell = textField.text!
    print(amountFromCell)
}

}

Ejecuté el código y muestra lo que escribo en el campo de texto en la consola. Pero esta variable, como puedes ver, está definida en TableViewCell, no donde está presente el botón.

Entonces creé otra variable amountFromCell en la clase TableViewCell para almacenar los datos en ella.

Y hice algo así:

amountFromTable = cell.amountFromCell

return cell

Y finalmente ejecuté este código cuando hago clic en el botón:

@IBAction func btnPrintAmount(_ sender: UIButton) {
    print(amountFromTable)
}

Pero devuelve vacío.

Entonces sé que tengo un valor en amountFromCell, pero no estoy seguro si al usar amountFromTable = cell.amountFromCell al devolver la celda, se agrega a amountFromTable o no.

O tal vez amountFromTable = cell.amountFromCell agrega nil cuando se crea la celda y no está obteniendo el valor más reciente del campo de texto.

Estoy confundido sobre cómo enviar datos desde este campo de texto que está dentro de la tabla a una variable definida fuera de la tableView.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para enviar datos desde el cuadro de texto dentro de la tabla a una variable que está definida fuera de la tabla, puedes utilizar un método delegado. Primero, crea un protocolo con un método que reciba el texto del cuadro de texto como parámetro:

    protocol TableViewCellDelegate: AnyObject {
        func cellDidUpdateTextField(_ text: String)
    }
    

    Luego, en tu clase TableViewCell, establece el delegado de la celda como el controlador de vista:

    class TableViewCell: UITableViewCell {
        weak var delegate: TableViewCellDelegate?
        ...
    }
    

    A continuación, en la función textFieldDidChangeSelection, llama al método del delegado con el texto del cuadro de texto:

    func textFieldDidChangeSelection(_ textField: UITextField) {
        delegate?.cellDidUpdateTextField(textField.text ?? "")
    }
    

    En el controlador de vista que contiene la tabla, implementa el protocolo TableViewCellDelegate y establece el delegado de cada celda como self:

    class MyViewController: UITableViewController, TableViewCellDelegate {
        ...
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
            cell.delegate = self
            return cell
        }
        ...
        func cellDidUpdateTextField(_ text: String) {
            amountFromTable = text
        }
        ...
    }
    

    Finalmente, puedes acceder a la variable amountFromTable actualizada desde la función de acción del botón:

    @IBAction func btnPrintAmount(_ sender: UIButton) {
        print(amountFromTable)
    }
    

    Con esta implementación, cada vez que el texto del cuadro de texto cambia, se llamará a la función cellDidUpdateTextField y el controlador de la vista podrá actualizar la variable amountFromTable.

Comments are closed.