Ios 在Swift中以编程方式选择表格单元格
在Swift中,我可以选择如下表格单元格:Ios 在Swift中以编程方式选择表格单元格,ios,swift,xcode,Ios,Swift,Xcode,在Swift中,我可以选择如下表格单元格: let indexPath = IndexPath(row: 0, section: 0); tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none) tableView.delegate?.tableView!(tableView, didSelectRowAt: indexPath) 但尝试按如下方式
let indexPath = IndexPath(row: 0, section: 0);
tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
tableView.delegate?.tableView!(tableView, didSelectRowAt: indexPath)
但尝试按如下方式调用didSelectRowAt
:
let indexPath = IndexPath(row: 0, section: 0);
tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
tableView.delegate?.tableView!(tableView, didSelectRowAt: indexPath)
哪一个触发了这个:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = categoryListView.cellForRow(at: indexPath) as! CategoryCellView // error here
//do other stuff
}
并在上面的//错误处导致此错误:
线程1:致命错误:在展开可选值时意外发现nil
我将该类用于类别CellView
,它是一个单独的nib:
@IBDesignable
class CategoryCellView: UITableViewCell {
@IBOutlet weak var myCategoryView: Category!
var categoryId: Int?
var index: Int?
}
我怎样才能在这里触发didSelectRowAt?你很接近
尝试一下:
let indexPath = IndexPath(row: 0, section: 0);
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
self.tableView(tableView, didSelectRowAt: indexPath)
编辑
如前所述(这在许多地方都可以找到),永远不要调用包含will
、did
和should
的委托方法
另一种方法可能是:
@objc func simulateSelectRow() -> Void {
print("sim")
let indexPath = IndexPath(row: 0, section: 0);
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
myDidSelectRowAt(tableView, indexPath: indexPath)
}
func myDidSelectRowAt(_ tableView: UITableView, indexPath: IndexPath) -> Void {
// do what you want when row is selected
print("Row:", indexPath.row, "in Section:", indexPath.section, "was selected.")
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
myDidSelectRowAt(tableView, indexPath: indexPath)
}
这可能适合您的需要,也可能不适合您的需要,但它可能是一个选项。cellForRow(at:indexPath)
如果单元格不可见,则返回nil,并且在调用selectRow后,单元格可能不会立即可见。因此,我建议更新您的didSelectRow实现,以避免出现as代码>强制展开并加强防御:
如果让cell=categoryListView.cellForRow(at:indexPath)作为?分类细胞视图{
//用手机做些什么
}
(如果更有意义的话,也可以使用guard let
)
我建议不要直接从您自己的代码中调用UITableView或UITableViewDelegate函数,如didSelectRow
(或其他UIKit标准委托函数),因为这会破坏这些函数的原始设计契约。如果直接在UITableView对象上调用didSelectRow,这可能会导致错误或不必要的行为。相反,在类中编写另一个实现UITableViewDelegate的自定义函数,您可以在调用selectRow后更新相应的UITableViewCell。您可以从didSelectRow实现中调用相同的函数,从而重用一些代码
根据didSelectRow方法中需要对单元格执行的操作,可以用其他方式处理编程选择场景。例如:
- 在cellForRowAt实现中,您可以检查
indexPath==tableView.indexPathForSelectedRow
,或者检查tableView.indexpathForSelectedRows?是否包含(indexPath)??false
,用于确定将要显示的单元格是否为选定单元格。请注意,此时单元格的isSelected值可能为false。如果需要,UITableView会立即将isSelected设置为true。这导致了第二种选择:
- 如果只需要更新特定表格视图单元格的外观,请在CategoryCellView中实现
覆盖func setSelected(uSelected:Bool,animated:Bool)
。如果在调用selectRow时该单元格已可见,则会立即调用setSelected。如果在调用selectRow时该单元格不可见,则稍后当用户滚动到该单元格时,将在调用代理的表格视图(:,cellForRowAt:)
后立即调用该单元格上的setSelected
永远不要自己调用包含will
、did
和should
的委托方法。总的来说,我同意。在这种情况下。。。六羟甲基三聚氰胺六甲醚。。。也许吧?我很好奇为什么你不想使用selectRow
-这是推荐的以编程方式选择单元格的方法。didSelectRowAt:
在以编程方式选择行后不会被调用(你自己也不要调用它)。一个可能的解决方案是将代码放入另一个方法中,以便能够重用它。这会导致错误,条件绑定的初始值设定项必须具有可选类型,而不是“CategoryCellView”
,因此我将其改为,如果let cell=categoryListView.cellForRow(at:indexPath)为!CategoryCellView代码>并且一切都正常工作。