web-dev-qa-db-fra.com

Comment sélectionner par programme une ligne dans UITableView dans Swift 1.2 (Xcode 6.4)

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?

38
Mikee

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 / ).

25
Martin R

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)
50
Sourabh Sharma

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.

15
Pankaj purohit

Swift 3.x

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
}
10
Sandu

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
    }
}
9
Alessandro Ornano

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:) 
0
rip...