Actualizar cierta fila de UITableView basada en Int en Swift


89

Soy un desarrollador principiante en Swift y estoy creando una aplicación básica que incluye UITableView. Quiero actualizar una cierta fila de la tabla usando:

self.tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.none)

y quiero que la fila que se actualizará sea de un Int llamado rowNumber

El problema es que no sé cómo hacer esto y todos los hilos que he buscado son para Obj-C

¿Algunas ideas?


¿Hay solo una sección?
Lyndsey Scott

Respuestas:


196

Puede crear un NSIndexPathusando el número de fila y sección y luego volver a cargarlo así:

let indexPath = NSIndexPath(forRow: rowNumber, inSection: 0)
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)

En este ejemplo, asumí que su tabla solo tiene una sección (es decir, 0) pero puede cambiar ese valor en consecuencia.

Actualización para Swift 3.0:

let indexPath = IndexPath(item: rowNumber, section: 0)
tableView.reloadRows(at: [indexPath], with: .top)

si para una sección particular se va a cambiar el número de filas, entonces? @Lyndsey Scott
dip

@Lyndsey: En realidad, al principio, digamos que tengo 2 celdas en esa sección de las que voy a recargar, después de recargar, digamos que tendré (x) números de celdas en esa sección en particular, así que mi pregunta es que en la línea de cálculo de indexpath, estoy seguro de la sección pero estoy confundido con el número de filas, porque se bloquea al cambiar el número de filas var indexPath = NSIndexPath (forRow: rowNumber, inSection: 0)
dip

@dip, debe mirar su tableView: numberOfRowsInSection: algoritmo de método para obtener esa información ... Recomiendo publicar su pregunta en el foro ya que parece un problema específico que está teniendo con su código ...
Lyndsey Scott

¿Dónde llamar a este método?
Master AgentX

22

Para una solución de animación de impacto suave:

Swift 3:

let indexPath = IndexPath(item: row, section: 0)
tableView.reloadRows(at: [indexPath], with: .fade)

Rápido 2.x:

let indexPath = NSIndexPath(forRow: row, inSection: 0)
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

Esta es otra forma de evitar que la aplicación se bloquee:

Swift 3:

let indexPath = IndexPath(item: row, section: 0)
if let visibleIndexPaths = tableView.indexPathsForVisibleRows?.index(of: indexPath as IndexPath) {
    if visibleIndexPaths != NSNotFound {
        tableView.reloadRows(at: [indexPath], with: .fade)
    }
}

Rápido 2.x:

let indexPath = NSIndexPath(forRow: row, inSection: 0)
if let visibleIndexPaths = tableView.indexPathsForVisibleRows?.indexOf(indexPath) {
   if visibleIndexPaths != NSNotFound {
      tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
   }
}

4

Rápido 4

let indexPathRow:Int = 0    
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

2

En Swift 3.0

let rowNumber: Int = 2
let sectionNumber: Int = 0

let indexPath = IndexPath(item: rowNumber, section: sectionNumber)

self.tableView.reloadRows(at: [indexPath], with: .automatic)

Por defecto, si solo tiene una sección en TableView, puede poner el valor de sección 0.


2
let indexPathRow:Int = 0
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

1
Hola, te damos la bienvenida a Stack Overflow y gracias por tu primera respuesta. Para que la respuesta sea más útil para otras personas, es una buena práctica anotar su respuesta con un texto que explique por qué aborda la pregunta original del OP.
Spangen

2

SWIFT 4.2

    func reloadYourRows(name: <anyname>) {
    let row = <your array name>.index(of: <name passing in>)
    let reloadPath = IndexPath(row: row!, section: 0)
    tableView.reloadRows(at: [reloadPath], with: .middle)
    }

1

Además, si tiene secciones para la vista de tabla, no debe intentar encontrar todas las filas que desea actualizar, debe usar las secciones de recarga. Es un proceso fácil y más equilibrado:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)

0

Qué tal si:

self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)

0

Swift 4.1

utilícelo cuando elimine la fila usando selectedTag of row.

self.tableView.beginUpdates()

        self.yourArray.remove(at:  self.selectedTag)
        print(self.allGroups)

        let indexPath = NSIndexPath.init(row:  self.selectedTag, section: 0)

        self.tableView.deleteRows(at: [indexPath as IndexPath], with: .automatic)

        self.tableView.endUpdates()

        self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .automatic)

0

Me doy cuenta de que esta pregunta es para Swift, pero aquí está el código equivalente de Xamarin de la respuesta aceptada si alguien está interesado.

var indexPath = NSIndexPath.FromRowSection(rowIndex, 0);
tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Top);

0
    extension UITableView {
        /// Reloads a table view without losing track of what was selected.
        func reloadDataSavingSelections() {
            let selectedRows = indexPathsForSelectedRows

            reloadData()

            if let selectedRow = selectedRows {
                for indexPath in selectedRow {
                    selectRow(at: indexPath, animated: false, scrollPosition: .none)
                }
            }
        }
    }

tableView.reloadDataSavingSelections()

Me encontré en una situación particular. Mi objetivo principal era lograr eso cuando el usuario está en una celda. Y he hecho algunas modificaciones. Puede actualizar solo la celda, está adentro, sin cargar toda la tabla y confundir al usuario. Por esta razón, esta función aprovecha las propiedades de tableView, agregando un ReloadDataCell personalizado. Y agregando tableview.reloadDataSavingSelecctions (). Dónde, haces algo de acción. Y una vez que lo hice, quería compartir esa solución con ustedes.
irwin B

Agregue todas las aclaraciones a su respuesta editándola
Nico Haase
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.