wake-up-neo.net

So programmieren Sie eine Zeile in UITableView in Swift 1.2 (Xcode 6.4)

Ich muss eine Zeile in einem UITableView programmgesteuert mit Xcode 6.4/Swift 1.2 auswählen. 

Dies ist der einfache Code:

var index = NSIndexPath(forRow: 0, inSection: 0)
self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
self.tableView(self.tableView, didSelectRowAtIndexPath: index)

Das oben genannte gibt mir den folgenden Fehler:

'selectRowAtIndexPath' kann nicht mit einer Argumentliste vom Typ 'aufgerufen werden (NSIndexPath !, animiert: Bool, scrollPosition: UITableViewScrollPosition)'

Was ist falsch an meinem Code? Vielleicht hat jemand anderes dies mit Swift 1.2 erlebt?

Jede Hilfe wird sehr geschätzt!

Prost

EDIT: Mein UItableView wurde im UIViewController in IB erstellt, damit ich den obigen Code aufrufen möchte. Wenn ich den Code in einen UITableViewController stecke, gibt der Compiler keine Fehler aus. Muss ich einen UITableViewController in einen Container einbetten, oder gibt es einen anderen Weg?

38
Mikee

Die Aussage

self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)

geht davon aus, dass tableView eine Eigenschaft des View-Controllers ist, der mit einer Tabellensicht im Storyboard verbunden ist Ein UITableViewController hat beispielsweise bereits diese -Eigenschaft. 

In Ihrem Fall ist der View-Controller kein Table-View-Controller Sondern eine Unterklasse eines UIViewController. Es hat auch einen Ausgang, der mit der Tabellensicht verbunden ist. Er heißt jedoch nicht tableView, sondern menuTable. Dann musst du natürlich anrufen

self.menuTable.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)

um eine Zeile dieser Tabellenansicht auszuwählen.

Die seltsamen Fehlermeldungen werden durch die Tatsache verursacht, dass self.tableView vom Compiler auch als "Curried function" verstanden werden kann (vergleiche http://oleb.net/blog/2014/07/Swift- Instanz-Methoden-Curried-Funktionen/ ).

25
Martin R

Swift 3.x Solution

Auswahl einer Zeile

let indexPath = IndexPath(row: 0, section: 0)
myTableView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)

Auswahl einer Zeile

let deselectIndexPath = IndexPath(row: 7, section: 0)
myTableView.deselectRow(at: deselectIndexPath, animated: true)
myTableView.delegate?.tableView!(myTableView, didDeselectRowAt: indexPath)
50
Sourabh Sharma

Verwenden Sie den folgenden Code, nachdem Sie Ihre Tabellenansicht mit Daten geladen haben:

let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0);  //slecting 0th row with 0th section
self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None);

jetzt müssen Sie die didSelectRowAtIndexPath: delegate-Methode mit folgendem Code manuell aufrufen:

self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect); //Manually trigger the row to select

Vielen Dank.

15
Pankaj purohit

Swift 3.x

wenn Sie es bei der 'Zellenerstellung' tun möchten, können Sie es so machen

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

Verwenden Sie Swift 2.x, wie in Pankaj purohit answers die richtige Methode ist:

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

Denken Sie daran, dass Sie, wenn Sie diese Methode beispielsweise von einer externen Klasse aufrufen, nicht wissen, wann tableView mit dem Laden fertig ist. Welche Möglichkeiten gibt es? :

Schritt eins: Erstellen Sie eine Klasse boolean var

var automatingTap: Bool = false

Schritt zwei: Überprüfen Sie, wann die Tabelle vollständig geladen ist, und starten Sie eine Methode zum Beenden von Operationen:

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

Schritt drei: Aufruf meiner tableView-Klasse von einer anderen Klasse

zum Beispiel:

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
    if segue!.identifier == "DetailsTableView" {
        let viewController:ViewController = segue!.destinationViewController as ViewController
        viewController.automatingTap = true
    }
}
9

Diese wiederverwendbare Funktion funktioniert und überprüft die Größe der Tabelle.

func selectRow(tableView: UITableView, position: Int) {
    let sizeTable = tableView.numberOfRows(inSection: 0)
    guard position >= 0 && position < sizeTable else { return }
    let indexPath = IndexPath(row: position, section: 0)
    tableView.selectRow(at: indexPath, animated: true, scrollPosition: .middle)
}

sie können es auf diese Weise verwenden

selectRow(tableView: myTableView, position: pos)

oder Sie können diese Erweiterung implementieren:

extension UITableView {
    func selectRow(row: Int, section: Int = 0) {
        let sizeTable = self.numberOfRows(inSection: section)
        guard row >= 0 && row < sizeTable else { return }
        let indexPath = IndexPath(row: row, section: section)
        self.selectRow(at: indexPath, animated: true, scrollPosition: .middle)
    }
}

und Sie können es auf diese Weise verwenden:

mytableView.selectRow(row: pos, section: 0)

oder

mytableView.selectRow(row: pos)
0
blacker

Swift 4.2:

Wählen Sie eine oder mehrere Zeilen aus

let ndx:IndexSet = [1]
// or:  let ndx:IndexSet = [1, 2, 3]; // etc
tableview?.selectRowIndexes(ndx, byExtendingSelection: false);

Auswahl einer einzelnen Zeile aufheben

tableview?.deselectRow(current)

Wenn Sie (func tableViewSelectionDidChange (...)) implementiert haben, wird dies durch das Obige ausgelöst.

In der Antwort von Charlton Provatas unter https://stackoverflow.com/a/48696458/352920 finden Sie eine Erweiterung zu NSTableView, die eine einfache Möglichkeit bietet 

tableview?.selectRow(at:) 
0
rip...