Как программно выбирать строку в 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:)