我需要使用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或者有其他方法吗?
答案 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
的子类。它也有一个插座
连接到表视图,但它没有被调用
UITableViewController
但UIViewController
。当然你必须打电话
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)
如果你想在'细胞创造'中做到这一点,你可以这样做
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)