Actualiser certaines lignes de UITableView en fonction de Int dans Swift


88

Je suis un développeur débutant dans Swift et je crée une application de base qui comprend un UITableView. Je souhaite actualiser une certaine ligne du tableau en utilisant:

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

et je veux que la ligne qui sera actualisée provienne d'un Int nommé rowNumber

Le problème est que je ne sais pas comment faire cela et tous les fils que j'ai recherchés sont pour Obj-C

Des idées?


N'y a-t-il qu'une seule section?
Lyndsey Scott

Réponses:


195

Vous pouvez créer un en NSIndexPathutilisant le numéro de ligne et de section puis le recharger comme ceci:

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

Dans cet exemple, j'ai supposé que votre table n'a qu'une seule section (c'est-à-dire 0) mais vous pouvez modifier cette valeur en conséquence.

Mise à jour pour Swift 3.0:

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

si pour une section particulière le nombre de lignes va être changé alors? @Lyndsey Scott
dip

@Lyndsey: En fait, disons d'abord que j'ai 2 cellules dans cette section dont je vais recharger, après le rechargement, disons que j'aurai un (x) nombre de cellules dans cette section particulière, donc ma question est que dans la ligne de calcul de l'indexpath, je suis sûr de la section mais je suis confus sur le nombre de lignes, car il se bloque sur le changement du nombre de lignes var indexPath = NSIndexPath (forRow: rowNumber, inSection: 0)
dip

@dip, vous devez regarder votre tableView: numberOfRowsInSection: algorithme de méthode pour obtenir ces informations ... Je vous recommande de publier votre question sur le forum car cela ressemble à un problème spécifique que vous rencontrez avec votre code ...
Lyndsey Scott

Où appeler cette méthode?
Master AgentX

22

Pour une solution d'animation à impact doux:

Swift 3:

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

Swift 2.x:

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

Voici une autre façon de protéger l'application contre le plantage:

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)
    }
}

Swift 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

Swift 4

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

2

Dans 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)

Par défaut, si vous n'avez qu'une seule section dans TableView, vous pouvez mettre la valeur de section 0.


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

1
Bonjour, Bienvenue sur Stack Overflow et merci pour votre première réponse. Pour rendre la réponse plus utile à d'autres personnes, il est recommandé d'annoter votre réponse avec un texte expliquant pourquoi elle répond à la question initiale du PO.
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

De plus, si vous avez des sections pour tableview, vous ne devez pas essayer de trouver toutes les lignes que vous souhaitez actualiser, vous devez utiliser des sections de rechargement. C'est un processus simple et plus équilibré:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)

0

Que diriez-vous:

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

0

Swift 4.1

utilisez-le lorsque vous supprimez une ligne à l'aide de 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

Je me rends compte que cette question est pour Swift, mais voici le code équivalent Xamarin de la réponse acceptée si quelqu'un est intéressé.

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()

Je me suis retrouvé dans une situation particulière. Mon objectif principal était d'accomplir cela lorsque l'utilisateur est dans une cellule. Et j'ai fait quelques modifications. Vous ne pouvez mettre à jour que la cellule dans laquelle elle se trouve, sans charger la table entière et dérouter l'utilisateur. Pour cette raison, cette fonction tire parti des propriétés tableView, en ajoutant un ReloadDataCell personnalisé. Et en ajoutant tableview.reloadDataSavingSelecctions (). Où, vous faites une action. Et une fois que je l'ai fait, j'ai voulu partager cette solution avec vous.
irwin B

Veuillez ajouter toutes les clarifications à votre réponse en la modifiant
Nico Haase
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.