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?

SentientBacon
la source
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)
Lyndsey Scott
la source
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)
   }
}
Alessandro Ornano
la source
4

Swift 4

let indexPathRow:Int = 0    
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)
Neha
la source
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.

jaiswal Rajan
la source
2
let indexPathRow:Int = 0
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)
Sachin Rasane
la source
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)
    }
Légende_ 33
la source
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)
Burcu Kutluay
la source
0

Que diriez-vous:

self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)
ligne d'horizon75489
la source
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)
Rana Ali Waseem
la source
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);
bagel sauvage
la source
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()
irwin B
la source
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