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?
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/ ).
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)
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.
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
}
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
}
}
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)
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:)