這個問題在這里已經有了答案: “致命錯誤:在展開可選值時意外發現 nil”是什么意思? (15 個回答) 11 小時前關閉。
我正在嘗試為圖片添加標簽,以指示顯示所選圖片的時間。我已將標簽添加到包含圖片的 detailView 并將標簽鏈接到 DetailViewController 類。我為此標簽設定了一個名稱,但在從串列中選擇圖片時出現“意外發現 nil”崩潰。這是一個 DetailViewController:
class DetailViewController: UIViewController {
@IBOutlet var imageView: UIImageView!
@IBOutlet var name: UILabel!
var selectedImage : String?
var detailVCTitle: String?
override func viewDidLoad() {
super.viewDidLoad()
title = detailVCTitle
navigationItem.largeTitleDisplayMode = .never
if let imageToLoad = selectedImage {
imageView.image = UIImage(named: imageToLoad)
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.hidesBarsOnTap = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.hidesBarsOnTap = false
}
}
這是我正在嘗試修改的功能:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let vc = storyboard?.instantiateViewController(withIdentifier: "Detail") as?
DetailViewController {
counter = 1
vc.selectedImage = pictures[indexPath.row]
navigationController?.pushViewController(vc, animated: true)
vc.detailVCTitle = "Picture \(indexPath.row 1) of \(pictures.count)"
vc.name.text = "It was shown \(counter) times"
}
}
uj5u.com熱心網友回復:
簡短而明顯的答案是,vc.name它nil是一個隱式展開的可選選項。
問題是“為什么它為零?假設其他一切都是正確的并且你已經連接了插座?”
原因是視圖在加載時被實體化并分配給插座屬性。這發生在loadView顯式呼叫或隱式呼叫時,如果存在對視圖控制器view屬性的參考。在你說之前這些事情都沒有發生,vc.name.text=...所以你得到了一個 nil 崩潰。
直接從另一個物件參考視圖控制器的視圖是違反封裝的;它將您的表視圖控制器與詳細視圖控制器的實作細節緊密耦合。
您會注意到您的其他屬性,selectedImage僅detailVCTitle此而已;簡單的屬性。視圖控制器在viewDidLoad.
你應該對你的計數做同樣的事情:
class DetailViewController: UIViewController {
@IBOutlet var imageView: UIImageView!
@IBOutlet var name: UILabel!
var selectedImage : String?
var detailVCTitle: String?
var counter = 0
override func viewDidLoad() {
super.viewDidLoad()
title = detailVCTitle
navigationItem.largeTitleDisplayMode = .never
if let imageToLoad = selectedImage {
imageView.image = UIImage(named: imageToLoad)
}
name.text = "It was shown \(counter) times"
}
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let vc = storyboard?.instantiateViewController(withIdentifier: "Detail") as?
DetailViewController {
counter = 1
vc.selectedImage = pictures[indexPath.row]
navigationController?.pushViewController(vc, animated: true)
vc.detailVCTitle = "Picture \(indexPath.row 1) of \(pictures.count)"
vc.counter = counter
}
}
現在,您的表格視圖只知道您的詳細視圖需要一個計數器。它不知道,也不需要知道該計數器是如何使用的。您的詳細視圖控制器可以在多個地方或以不同的方式使用它,具體取決于它的值或其他...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494321.html
上一篇:使用AVPlayer下載異步視頻(如AsyncImage)?
下一篇:快速創建按鈕時出現回圈錯誤
