如何以编程方式在Swift 1.2(Xcode 6.4)中的UITableView中选择一行

Mik*_*kee 50 uitableview ios swift

我需要使用Xcode 6.4/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)
Run Code Online (Sandbox Code Playgroud)

上面给出了以下错误:

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

我的代码出了什么问题?也许有人用Swift 1.2体验过这个?

任何帮助是极大的赞赏!

干杯

编辑: 我的UItableView已在UIViewController中的IB中创建,我试图调用上面的代码.当我将代码放在UITableViewController中时,编译器不会给出任何错误.我需要在容器中嵌入UITableViewController还是有另一种方法?

Sou*_*rma 67

Swift 3.x解决方案

选择一行

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

DeSelecting a Row

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


Mar*_*n R 35

该声明

self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
Run Code Online (Sandbox Code Playgroud)

假设它tableView是视图控制器的属性,连接到Storyboard中的表视图.UITableViewController例如,A 已经拥有此属性.

在您的情况下,视图控制器不是表视图控制器,而是a的子类UIViewController.它也具有连接到表视图的出口,但它不叫 tableView,但menuTable.当然你必须打电话

self.menuTable.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
Run Code Online (Sandbox Code Playgroud)

选择该表视图的一行.

奇怪的错误消息是由self.tableView编译器理解为"curried函数" 的事实引起的 (比较http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/) .


Pan*_*hit 17

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

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

现在,您必须使用以下代码手动调用didSelectRowAtIndexPath: delegate方法:

self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect); //Manually trigger the row to select
Run Code Online (Sandbox Code Playgroud)

谢谢.


San*_*ndu 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
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*ano 9

使用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)
}
Run Code Online (Sandbox Code Playgroud)

请记住,如果您从外部类调用此方法,您不知道tableView何时完成其加载,那么可能性是什么?,如何解决此问题?:

第一步:创建一个类boolean var

var automatingTap: Bool = false
Run Code Online (Sandbox Code Playgroud)

第二步:检查表何时完成加载并启动"结束操作"方法:

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
   }
}
Run Code Online (Sandbox Code Playgroud)

第三步:从另一个类调用我的tableView类

例如:

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


bla*_*ker 5

可重用功能,验证表大小

斯威夫特 4 和 5

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

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)
}
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它

selectRow(tableView: myTableView, position: pos)
Run Code Online (Sandbox Code Playgroud)

或者你可以实现这个扩展:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它:

mytableView.selectRow(row: pos, section: 0)
Run Code Online (Sandbox Code Playgroud)

或者

mytableView.selectRow(row: pos)
Run Code Online (Sandbox Code Playgroud)