手动调用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) } } }