Как программно выбирать строку в UITableView в Swift 1.2 (Xcode 6.4)

Мне нужно выбрать строку в UITableView программно, используя Xcode 6.4/Swift 1.2.

Это простой код:

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

Приведенное выше дает мне следующую ошибку:

Невозможно вызвать 'selectRowAtIndexPath' с помощью списка аргументов типа '(NSIndexPath !, animated: Bool, scrollPosition: UITableViewScrollPosition)'

Что не так с моим кодом? Может быть, кто-то другой испытал это с Swift 1.2?

Любая помощь очень ценится!

ура

EDIT: мой UItableView был создан в IB в UIViewController, который я пытаюсь вызывать выше. Когда я помещаю код в UITableViewController, компилятор не дает никаких ошибок. Нужно ли встраивать UITableViewController в контейнер или есть другой способ?

Ответы

Ответ 1

Заявление

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

предполагает, что tableView является свойством контроллера вида, подключенного к представлению таблицы в раскадровке. Например, UITableViewController уже имеет это свойство.

В вашем случае контроллер представлений - это не контроллер табличного представления, а подкласс UIViewController. Он также имеет выход, который подключен к представлению таблицы, но он не называется tableView а menuTable. Тогда, конечно, вы должны позвонить

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

для выбора строки этого вида таблицы.

Странные сообщения об ошибках вызваны тем фактом, что self.tableView также может быть понят компилятором как "валютная функция" (сравните http://oleb.net/blog/2014/07/swift-instance-methods-curried- функции /).

Ответ 2

Решение Swift 3.x

Выбор строки

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

Выделение строки

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

Ответ 3

Используйте нижеприведенный код, после загрузки табличного представления данными:

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

теперь вам нужно вручную вызвать метод didSelectRowAtIndexPath: делегировать, используя нижеприведенный код:

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

Благодарю.

Ответ 4

Swift 3.x

если вы хотите сделать это в "создании ячейки", вы можете сделать это так

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
}

Ответ 5

Используя Swift 2.x, как описано Pankaj purohit, правильный метод:

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

Имейте в виду, что если вы вызовете этот метод из внешнего класса, например, вы не знаете, когда tableView завершил его загрузку, и какие возможности?, как решить эту проблему? :

Шаг первый: создайте класс boolean var

var automatingTap: Bool = false

Шаг второй: проверьте, завершает ли таблица загрузку и запускает метод "конечных операций":

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

Шаг третий: вызовите мой класс tableView из другого класса

например:

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

Ответ 6

Swift 4.2:

Выберите один или несколько строк

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

Отменить выбор одной строки

tableview?.deselectRow(current)

Обратите внимание, что если у вас (func tableViewSelectionDidChange (...)) реализовано, это будет вызвано вышеуказанным.

Также см. Ответ Charlton Provatas на fooobar.com/info/2156399/... для расширения к NSTableView, который обеспечивает простой

tableview?.selectRow(at:)