簡體   English   中英

Swift:未調用推送的 ViewController deinit

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM