如何以编程方式在Swift中的UITableView中选择一行

时间:2015-07-06 14:06:10

标签: ios swift uitableview

我需要使用Swift 1.2以编程方式在UITableView中选择一行。

这是简单的代码:

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

上面给出了以下错误:

  

无法调用' selectRowAtIndexPath'使用类型'的参数列表(NSIndexPath!,动画:Bool,scrollPosition:UITableViewScrollPosition)'

我的Swift 1.2代码出了什么问题?

我的UItableView已在UIViewController中的IB中创建,我试图调用上面的代码。 当我将代码放在UITableViewController中时,编译器不会给出任何错误。 我是否需要在容器中嵌入UITableViewController或者有其他方法吗?

7 个答案:

答案 0 :(得分:54)

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)

答案 1 :(得分:29)

声明

{
     "id": "one",
     "tags": ["A", "B"]
}

{
     "id": "two",
     "tags": ["A", "C"]
}

假设SELECT * FROM c WHERE ARRAY_CONTAINS(c.tags, "B") 是视图控制器的属性,已连接 到故事板中的表格视图。例如,self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle) 已经有了这个 属性。

在您的情况下,视图控制器不是表视图控制器 但是tableView的子类。它也有一个插座 连接到表视图,但它没有被调用 UITableViewControllerUIViewController。当然你必须打电话

tableView

选择该表视图的一行。

奇怪的错误消息是由以下事实引起的 编译器也可以将menuTable理解为 “curried function”(比较http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/)。

答案 2 :(得分:16)

在使用数据加载表格视图后,使用以下代码:

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

感谢。

答案 3 :(得分:11)

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
}

答案 4 :(得分:9)

使用 Swift 2.x ,如Pankaj purohit answers所述,正确的方法是:

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

答案 5 :(得分:1)

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(...)),则上述操作会触发该事件。

另请参阅https://stackoverflow.com/a/48696458/352920上Charlton Provatas的答案,其中提供了对NSTableView的扩展,该扩展提供了简单的

tableview?.selectRow(at:) 

答案 6 :(得分:0)

此可重用函数可以工作并验证表的大小。

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

您可以通过这种方式使用

selectRow(tableView: myTableView, position: pos)

或者您可以实现此扩展:

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

您可以通过以下方式使用它:

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

mytableView.selectRow(row: pos)