iOS和Swift:确定强制展开tableView.indexPath?
问题描述:
我有一个从表视图控制器segue到另一个视图控制器。在方法内部准备(for:sender)我需要获取触发segue的单元格的indexPath。在这种情况下强行拆开索引路径可以吗?当所有的prepare()方法都是通过点击一个表格行触发的,所以我可以假设'sender'包含对有效对象的引用yes?iOS和Swift:确定强制展开tableView.indexPath?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "TheCorrectSegue" {
let indexPath = tableView.indexPath(for: sender as! UITableViewCell)! <-- is this OK?
}}
答
如果SEGUE连接到表格视图单元格,因为总是有效的细胞传递直通的sender
参数是安全的。
但它实际上是没有更多的代码写
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "TheCorrectSegue", let cell = sender as? UITableViewCell,
let indexPath = tableView.indexPath(for: cell) else { return }
// do something with the index path
}
答
这似乎是有点过度工程,但我有过在小区按钮和/或允许细胞被选中表格视图直。
所以我创建了UIView扩展方法来获取表视图的东西。
extension UIView {
var superTableViewCell: UITableViewCell? {
if let cell = self as? UITableViewCell {
return cell
}
return superview?.superTableViewCell
}
var superTableView: UITableView? {
if let tableView = self as? UITableView {
return tableView
}
return superview?.superTableView
}
var indexPathOfSuperTableViewCell: IndexPath? {
if let tableView = superTableView, let cell = superTableViewCell {
return tableView.indexPath(for: cell)
}
return nil
}
}
这让我减少得到正确索引路径的问题
private func _segueIndexPath(for view: UIView?) -> IndexPath? {
if let indexPath = view?.indexPathOfSuperTableViewCell {
return indexPath
}
return tableView.indexPathForSelectedRow
}
,最后,
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier ?? "" {
case "TheCorrectSegue":
guard let indexPath = _segueIndexPath(for: sender as? UIView) else {
// Handle error
return
}
// prepare for the segue.
default:
super.prepare(for: segue, sender: sender)
}
}
思考我的问题后,我才发现更深层次的问题我是试图问的是这样的:我可以假定当prepare()被调用时,iOS会给我有效的参数,还是我总是需要防范应该永远不会发生的情况?在上面的代码中,我想知道你会在guard语句else子句中做什么?除了崩溃之外,你会如何处理这样的错误? – ehmjaysee