我正在尝试以编程方式调用 didSelectRowAtIndexPath 但遇到了麻烦。
[self tableView:playListTbl didSelectRowAtIndexPath:indexPath];
给我以下错误:
使用未声明的标识符“indexPath”;你的意思是“NSIndexPath”吗?
有人可以帮帮我吗?谢谢!
编辑:从下面的回复来看,我好像走错了路。按下按钮时如何获取所选项目的文本(可以是多项选择)?我需要在专用于按钮按下的功能中执行此操作。
我正在尝试以编程方式调用 didSelectRowAtIndexPath 但遇到了麻烦。
[self tableView:playListTbl didSelectRowAtIndexPath:indexPath];
给我以下错误:
使用未声明的标识符“indexPath”;你的意思是“NSIndexPath”吗?
有人可以帮帮我吗?谢谢!
编辑:从下面的回复来看,我好像走错了路。按下按钮时如何获取所选项目的文本(可以是多项选择)?我需要在专用于按钮按下的功能中执行此操作。
您需要传递一个有效的参数,如果您没有indexPath
在调用范围内声明,那么您将收到该错误。尝试:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:ROW_YOU_WANT_TO_SELECT inSection:SECTION_YOU_WANT_TO_SELECT]
[self tableView:playListTbl didSelectRowAtIndexPath:indexPath];
将在哪里ROW_YOU_WANT...
替换为您要选择的行和部分。
但是,您真的不应该直接调用它。将内部完成的工作提取tableView:didSelectRowAtIndexPath:
到单独的方法中并直接调用它们。
要解决更新的问题,您需要使用indexPathsForSelectedRows
方法 on UITableView
。想象一下,您正在从字符串数组中填充表格单元格文本,如下所示:
- (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
此时将包含所有选定的信息。希望这个例子有意义。
迅捷解决方案
手动调用 didSelectRowAtIndexPath
let indexPath = IndexPath(row: 7, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .top)
tblView.delegate?.tableView!(tblView, didSelectRowAt: indexPath)
只是为了更新@Sourabh 的答案,请注意,您还可以scrollPosition
在调用时提供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
表格视图将感兴趣的行滚动到可见表格视图的底部。
如果您还没有一个要插入的变量,则需要定义一个 indexPath 变量。
就像是:
NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
从Mistalis answer开始,我制作了这个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)
}
}
}