我是Swift的新手,很高兴发现我们不再需要委托和协议来将数据块发送到另一个视图控制器。
但是,使用此代码:
...
class DetailTableViewController: UITableViewController {
var detailPicPath: String?
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let detailPredicate = NSPredicate(format: "account = %@", currentAccount)
let transactions = realm.objects(Transaction.self).filter(detailPredicate)
let orderedTransactions = transactions.sorted(byKeyPath: "transDate", ascending: false)
let item = orderedTransactions[indexPath.row]
detailPicPath = item.picPath
self.performSegue(withIdentifier: "microSegue", sender: indexPath.row)
}
这:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "microSegue" {
let destination: MicroDetailViewController = segue.destination as! MicroDetailViewController
destination.picPathForThisTrans = detailPicPath
}
我在nil
中收到destination.picPathForThisTrans
,并因以下警告而崩溃:
Fatal error: Unexpectedly found nil while unwrapping an Optional value
在目标视图控制器中调用picPathForThisTrans
的位置。
我已经搜索过SO和Google(通常会返回到SO),但是没有找到解决方案。我想知道我是否正确定义了var
。
一定可以使用一些指导!
TIA
修改
在阅读@rmaddy在下面引用的帖子时,我重新审视了我的问题,发现问题不在于保存属性,也不在于如何解开属性。虽然这些问题我当然需要更多的经验,但问题是由更根本的疏忽引起的-我既使用了Storyboard segue
,又使用了一个被称为代码的脚本。在故事板segue
中,prepareForSegue
没有相关信息。由于显然是通过编程方法调用的,因此它重写了接收器中的数据,从而在临界点处产生nil
。
当我发现(使用一堆print()
语句)prepareForSegue
被调用两次,加载一次和卸载一次时,发现了这个问题。
做了一些进一步的研究,发现this post使我得以解决此问题。非常感谢@rmaddy和为提到的与segue
s相关的帖子做出贡献的人!