手动调用didSelectRowatIndexPath

我试图以编程方式调用didSelectRowAtIndexPath,但有麻烦。

[self tableView:playListTbl didSelectRowAtIndexPath:indexPath]; 

给我以下错误:

使用未声明的标识符'indexPath'; 你的意思是'NSIndexPath'?

有人可以帮我吗? 谢谢!

编辑:从下面的答复听起来像我正在做这个错误的方式。 如何在按下button时获取所选项目的文本(可以有多个选项)? 我需要在专用于button按下的function中执行此操作。

你需要传递一个有效的参数,如果你没有在调用范围中声明indexPath ,那么你会得到这个错误。 尝试:

 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:ROW_YOU_WANT_TO_SELECT inSection:SECTION_YOU_WANT_TO_SELECT] [self tableView:playListTbl didSelectRowAtIndexPath:indexPath]; 

哪里ROW_YOU_WANT...将被replace您想要select的行和部分。

但是,你真的不应该直接调用这个。 将tableView:didSelectRowAtIndexPath:正在完成的工作提取到不同的方法中,并直接调用它们。

为了解决更新的问题,你需要在UITableView上使用indexPathsForSelectedRows方法。 想象一下,你是从一个string数组数组中填充表格单元格的文本,如下所示:

 - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tv dequeue...]; NSArray *rowsForSection = self.sectionsArray[indexPath.section]; NSString *textForRow = rowsForSection[indexPath.row]; cell.textLabel.text = textForRow; return cell; } 

然后,要获取所有选定的文本,您需要执行以下操作:

 NSArray *selectedIndexPaths = [self.tableView indexPathsForSelectedRows]; NSMutableArray *selectedTexts = [NSMutableArray array]; for (NSIndexPath *indexPath in selectedIndexPaths) { NSArray *section = self.sectionsArray[indexPath.section]; NSString *text = section[indexPath.row]; [selectedTexts addObject:text]; } 

selectedTexts将会包含所有select的信息。 希望这个例子是有道理的。

Swift 3.0解决scheme

手动调用didSelectRowAtIndexPath

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

你需要定义一个indexPathvariables,如果你还没有一个坚持的话。

就像是:

  NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 

只要更新@ Sourabh的答案 ,请注意,您也可以在调用selectRow时提供一个selectRow

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

变为:

 let indexPath = IndexPath(row: 7, section: 0) tblView.selectRow(at: indexPath, animated: true, scrollPosition: top) // <-- tblView.delegate?.tableView!(tblView, didSelectRowAt: indexPath) 

可能的常量是:

none

表格视图滚动感兴趣的行,以最小的移动完全可见。 如果该行已经完全可见,则不会发生滚动。 例如,如果行在可见区域上方,则行为与由top指定的行为相同。 这是默认的。

top

表格视图将感兴趣的行滚动到可见表格视图的顶部。

middle

表视图将感兴趣的行滚动到可见表格视图的中间。

bottom

表格视图将感兴趣的行滚动到可见表格视图的底部。

从Mistalis的答案开始,我做了这个小的ExtendedCell类,因为我在几个表视图中使用它。

表格视图中的用法:

 // Here MyTableView is UITableView and UITableViewDelegate // but you can separate them. class MyTableView: UITableView, UITableViewDelegate { override func dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? { return MyCell(identifier: identifier, table: self) } // ... } 

你的单元的实现:

 class MyCell : ExtendedCell { convenience init(identifier: String?, table: MyTableView) { // in this example, MyTableView is both table and delegate self.init(identifier: identifier, table: table, delegate: table) // ... } // At any moment you may call selectTableRow() to select // the row associated to this cell. func viewItemDetail() { selectTableRow() } } 

ExtendedCell类:

 import UIKit /** * UITableViewCell with extended functionality like * the ability to trigger a selected row on the table */ class ExtendedCell : UITableViewCell { // We store the table and delegate to trigger the selected cell // See: https://stackoverflow.com/q/18245441/manually-call-did-select-row-at-index-path weak var table : UITableView! weak var delegate : UITableViewDelegate! convenience init(identifier: String?, table: UITableView, delegate: UITableViewDelegate) { self.init(style: .default, reuseIdentifier: identifier) self.table = table self.delegate = delegate } func selectTableRow() { if let indexPath = table.indexPath(for: self) { table.selectRow(at: indexPath, animated: true, scrollPosition: .none) delegate.tableView!(table, didSelectRowAt: indexPath) } } }