Je dois sélectionner une ligne dans un UITableView à l'aide d'un programme utilisant Xcode 6.4/Swift 1.2.
C'est le code simple:
var index = NSIndexPath(forRow: 0, inSection: 0)
self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
self.tableView(self.tableView, didSelectRowAtIndexPath: index)
Ce qui précède me donne l'erreur suivante:
Impossible d'appeler 'selectRowAtIndexPath' avec une liste d'arguments de type '(NSIndexPath !, animé: Bool, scrollPosition: UITableViewScrollPosition)'
Quel est le problème avec mon code?
Toute aide est grandement appréciée!
À votre santé
EDIT: Mon UItableView a été créé dans IB dans UIViewController et j'essaie d'appeler le code ci-dessus. Lorsque je place le code dans un UITableViewController, le compilateur ne génère pas d'erreur . Dois-je incorporer un UITableViewController dans un conteneur ou existe-t-il un autre moyen?
La déclaration
self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
suppose que tableView
est une propriété du contrôleur de vue, connectéà une vue de table dans le Storyboard. Un UITableViewController
, par exemple, a déjà cette propriété
Dans votre cas, le contrôleur de vue n'est pas un contrôleur de vue de table .__, mais une sous-classe de UIViewController
. Il possède également une sortie connectée à la vue table, mais elle ne s'appelle pas tableView
, mais menuTable
. Ensuite, bien sûr, vous devez appeler
self.menuTable.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
pour sélectionner une ligne de cette vue tableau.
Les messages d'erreur étranges sont dus au fait que self.tableView
peut également être compris par le compilateur comme une "fonction curry" .__ (comparer http://oleb.net/blog/2014/07/Swift -instance-method-curried-functions / ).
Solution Swift 3.x
Sélection d'une ligne
let indexPath = IndexPath(row: 0, section: 0)
myTableView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)
Désélection d'une ligne
let deselectIndexPath = IndexPath(row: 7, section: 0)
myTableView.deselectRow(at: deselectIndexPath, animated: true)
myTableView.delegate?.tableView!(myTableView, didDeselectRowAt: indexPath)
Utilisez le code ci-dessous, après avoir chargé votre vue tableau avec des données:
let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0); //slecting 0th row with 0th section
self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None);
maintenant, vous devez appeler manuellement didSelectRowAtIndexPath: delegate avec le code ci-dessous:
self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect); //Manually trigger the row to select
Merci.
si vous voulez le faire à la 'création de cellule', vous pouvez le faire comme ceci
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = TableViewCell()
let item = items[indexPath.row]
cell.textLabel?.text = item.title
if (item.checked) {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
}
return cell
}
En utilisant Swift 2.x, comme décrit dans Pankaj purohit répond la méthode correcte est la suivante:
func tapRowAtIndex(index:Int) {
let rowToSelect:NSIndexPath = NSIndexPath(forRow: index, inSection: 0)
self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None)
self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect)
}
Gardez à l'esprit que si vous appelez cette méthode depuis une classe externe par exemple, vous ne savez pas quand le chargement de tableView sera terminé. Quelles sont donc les possibilités? Comment résoudre ce problème? :
Première étape: créer une classe boolean var
var automatingTap: Bool = false
Step two: vérifie quand la table a fini de se charger et lance une méthode "end operations":
func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
{
let lastRowIndex = tableView.numberOfRowsInSection(0)
if indexPath.row == lastRowIndex - 1 {
endOperations()
}
}
func endOperations()
{
print("finished loading")
if automatingTap {
tapRowAtIndex(0)
automatingTap = false
}
}
Troisième étape: appeler ma classe tableView depuis une autre classe
par exemple:
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
if segue!.identifier == "DetailsTableView" {
let viewController:ViewController = segue!.destinationViewController as ViewController
viewController.automatingTap = true
}
}
Swift 4.2:
Sélectionnez une ou plusieurs lignes
let ndx:IndexSet = [1]
// or: let ndx:IndexSet = [1, 2, 3]; // etc
tableview?.selectRowIndexes(ndx, byExtendingSelection: false);
Désélectionne une seule ligne
tableview?.deselectRow(current)
Notez que si vous avez (func tableViewSelectionDidChange (...)} _ implémenté, cela sera déclenché par ce qui précède.
Voir également la réponse de Charlton Provatas à l’adresse https://stackoverflow.com/a/48696458/352920 pour une extension à NSTableView, qui fournit une
tableview?.selectRow(at:)