Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中以编程方式选择表格单元格_Ios_Swift_Xcode - Fatal编程技术网

Ios 在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) 但尝试按如下方式

在Swift中,我可以选择如下表格单元格:

 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并且一切都正常工作。