Tengo un tableview dentro de un UIViewController, y en Main.storyboard, tengo un show segue de la celda prototipo en el tableview en el primer controlador de vista al segundo controlador de vista . Tengo este codigo:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showTheSeriesPage"
    {
        let indexPath : NSIndexPath = self.theTableAyy.indexPathForSelectedRow! as NSIndexPath
        var destViewController = segue.destination as! SeriesPageViewController
        var randomTemporaryArray = dataAry[indexPath.row]

        destViewController.sampleTitle = randomTemporaryArray.objectSeriesTitle
        destViewController.sampleAuthor = randomTemporaryArray.objectSeriesAuthor
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}

Funciona, pero solo cuando tableview está en un orden específico y se basa en indexPath.row, no en los detalles específicos de la celda en sí. ¿Cómo lo configuro para que no dependa del indexPath.row seleccionado, pero tal vez el texto de la etiqueta de la celda? ¡Gracias!

1
Ethan Zhao 5 abr. 2017 a las 19:22

2 respuestas

La mejor respuesta

Respuesta corta: no hagas eso. Su enfoque actual es el correcto. Debe tener un modelo de datos que contenga la información que se muestra en la vista de tabla. Cuando el usuario toca una celda, debe usar el indexPath de la celda seleccionada para buscar la entrada en su modelo y luego buscar cualquier cadena que sea apropiada para esa entrada.

Las celdas son objetos de vista y no debe usarlas para almacenar información.

4
Duncan C 5 abr. 2017 a las 16:26

Entiendo este problema, ya que es común cuando vincula TableView con el botón de búsqueda. Especialmente, si tiene una barra de búsqueda vinculada a los resultados de la tabla para cambiar dinámicamente.

Vi muchas publicaciones usando la función prepareForSegue pero quería usar la función preparar para pasar a la siguiente vista como usted. En mi caso, tener un área de código más controlada que envía el segue en acción desde una única función contenida.

Mi solución: 1. Tuve que declarar 2 variables en su controlador de vista para almacenar los resultados filtrados (nueva lista dinámica en la vista de tabla) y la fila seleccionada. por ejemplo, si estuviéramos lidiando con listados de automóviles,

var filteredCars = [Car]()
var selectedCar: AnyObject!

Luego en la función de barra de búsqueda:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    filteredCars = self.cars.filter({ (x: Car) -> Bool in

        return x.name?.lowercased().range(of: searchText.lowercased()) != nil

    })

    self.tbvOriginalTable.reloadData()
    // IMPORTANT store the new filtered table results to use them later
    saveFilteredTable = self.tbvOriginalTable

}

Ahora en la función de preparación:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "optionlist" {

        let controller = segue.destination as! MealListTableViewController
        // this is the declared @IBOutlet weak var searchCar: UISearchBar!
        if searchCar.text != "" {
controller.car = filteredCars[(saveFilteredTable.indexPathForSelectedRow?.row)!]

        } else {
            controller.car = cars[(tbvOriginalTable.indexPathForSelectedRow?.row)!]
        }
    }
}
// We have to use the controller to assign an object of type car on the other side of the segue to receive the passed record

Esto realmente me sirvió, me llevó un poco de lectura e investigación y finalmente lo hice sin necesidad de usar func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) junto con función prepareForSegue o cualquier otro tipo de codificación larga

Espero que esto también sea útil para muchas personas.

0
Ahmad Al-Baqawi 21 jul. 2017 a las 22:05