iOS 和 Swift:可以强制解开 tableView.indexPath?
Posted
技术标签:
【中文标题】iOS 和 Swift:可以强制解开 tableView.indexPath?【英文标题】:iOS and Swift: Ok to force unwrap tableView.indexPath? 【发布时间】:2017-04-26 19:54:56 【问题描述】:我有一个从表视图控制器到另一个视图控制器的 segue。在方法 prepare(for: sender) 中,我需要获取触发 segue 的单元格的 indexPath。在这种情况下可以强制解开索引路径吗?毕竟prepare()方法是通过点击表格行触发的,所以我可以假设'sender'包含对有效对象的引用是吗?
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if segue.identifier == "TheCorrectSegue"
let indexPath = tableView.indexPath(for: sender as! UITableViewCell)! <-- is this OK?
【问题讨论】:
【参考方案1】:如果 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
【讨论】:
【参考方案2】:这可能看起来有点过度设计,但我的表格视图在单元格中有按钮和/或允许直接选择单元格。
所以我创建了 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)
【讨论】:
在考虑了我的问题后,我意识到我想问的更深层次的问题是:我可以假设 ios 会在调用 prepare() 时给我有效的参数,还是我总是需要防范这种情况那不应该真的发生吗?在您上面的代码中,我想知道您将在保护语句 else 子句中做什么?除了崩溃,你会如何处理这样的错误?以上是关于iOS 和 Swift:可以强制解开 tableView.indexPath?的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中使用 Swift 保存 PDF 文件并显示它们
在 Swift 中从 AppDelegate 解开 UIWindow 两次