[英]Swift: pushed ViewController deinit not called
查看 Controller 結構
主視圖 Controller -> 表視圖 Controller -> 詳細視圖 Controller
它們都嵌入在導航 Controller 中。
我通過調用 pushViewController 推送了詳細視圖 Controller。 當我從詳細視圖 Controller 返回到表視圖 Controller 時,我意識到未調用詳細視圖 Controller deinit(),這會導致我的項目出現致命錯誤。
如何使 DetailViewController 取消初始化? 謝謝
調用 pushViewController 的表視圖 Controller 代碼的一部分
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedTilId = thisDayTIL[indexPath.row].id
if let detailVC = storyboard?.instantiateViewController(withIdentifier: "TILDetailViewController") as? TILDetailViewController {
detailVC.tilId = selectedTilId
detailVC.tilViewModel = self.tilViewModel
detailVC.subjectViewModel = self.subjectViewModel
self.navigationController?.pushViewController(detailVC, animated: true)
}
}
整體詳情查看Controller碼
//
// TILDetailViewController.swift
//
import UIKit
import RxSwift
class TILDetailViewController: UIViewController {
@IBOutlet weak var tilTitleLabel: UILabel!
@IBOutlet weak var tilSubjectLabel: UILabel!
@IBOutlet weak var tilContentLabel: UILabel!
var til: TIL!
var tilId: Int!
var tilViewModel: TILViewModel!
var subjectViewModel: SubjectViewModel!
var disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
_ = tilViewModel.allTIL
.map {
$0.filter { $0.id == self.tilId }
}
.subscribe(onNext: { [weak self] til in
self?.setLabelText(til[0])
self?.til = til[0]
})
.disposed(by: disposeBag)
let rightBarButton = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(editButtonClicked))
self.navigationItem.rightBarButtonItem = rightBarButton
}
deinit {
print("DetailVC deinitialized")
}
@objc private func editButtonClicked(_ sender: Any) {
guard let editVC = storyboard?.instantiateViewController(withIdentifier: "TILEditViewController") as? TILEditViewController else {
return
}
editVC.til = til
editVC.tilViewModel = self.tilViewModel
editVC.subjectViewModel = self.subjectViewModel
editVC.modalPresentationStyle = .overFullScreen
self.present(editVC, animated: true, completion: nil)
}
func setLabelText(_ til: TIL) {
tilTitleLabel.text = til.title
tilContentLabel.text = til.content
tilSubjectLabel.text = subjectViewModel.getSubjectNameById(til.subjectId)
}
}
您在 Detailed VC 中持有對self
的強烈引用,這會阻止它被釋放。 這稱為保留周期。
在這一行: $0.filter { $0.id == self.tilId }
。
將[weak self]
添加到您的map
塊將解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.