解除B视图时未调用UITableView函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解除B视图时未调用UITableView函数相关的知识,希望对你有一定的参考价值。

当我用view B解雇self.dismiss(animated: true, completion: nil)时,没有叫view AnumberOfRowsInSectioncellForRowAtviewDidLoad也没有。

这是我的代码,我是UITableView的新手,所以请原谅任何愚蠢的错误。

class WalletTableViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    @IBOutlet weak var segmentedControl: UISegmentedControl!

    @IBOutlet weak var addCryptoButton: UIButton!

    var cryptosArray: [Cryptos] = []

    override func viewDidLoad() {
        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.none
        tableView.delegate = self

        loadCryptoArray()
        print("viewDidLoad")
    }
    override func viewWillAppear(_ animated: Bool) {
        tableView.delegate = self

        loadCryptoArray()
        print("viewWillAppear")
    }

    func loadCryptoArray() {
        print("loadCryptoArray")

        if UserDefaults.standard.object(forKey: "cryptosArray") != nil {
            if let decoded = UserDefaults.standard.object(forKey: "cryptosArray") as? Data? {
                let decodedCryptoArray = NSKeyedUnarchiver.unarchiveObject(with: decoded!) as! [Cryptos]
                cryptosArray = decodedCryptoArray
            }
        } else {
            print("UserDefaults KO")
        }
    }

    @IBAction func addCryptoButtonTapped(_ sender: Any) {
        let cryptoPickerViewController = self.storyboard?.instantiateViewController(withIdentifier: "cryptoPickerViewController")
        self.present(cryptoPickerViewController!, animated: true)
    }
    @IBAction func segmentedControlTapped(_ sender: Any) {
        switch segmentedControl.selectedSegmentIndex
        {
        case 0:
            self.dismiss(animated: true, completion: nil)
        case 1:
            self.dismiss(animated: true, completion: nil)
        default:
            break
        }
    }
}

//-----------------------------

extension WalletTableViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cryptosArray.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let crypto = cryptosArray[indexPath.row]

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! WalletTableViewCell
        cell.setCrypto(crypto: crypto)
        cell.delegate = self

        return cell
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 85
    }
}
答案

viewDidLoadviewController的生命周期中被召唤一次。因此,假设A呈现B,那么当B被解雇时,没有理由再次调用viewDidLoad,因为A已经从之前加载并且只是在屏幕上显示。

要从呈现的B回来时重新加载表,只需将其添加到A

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    tableView.reloadData()
}

只要viewWillAppear出现在屏幕上,就会调用viewController回调。当从B回来时就是这种情况 - A被隐藏了,现在又重新出现了。在docs中阅读更多内容,特别是处理与视图相关的通知部分:

使用像viewWillAppear(_:)这样的方法来准备你的视图出现在屏幕上......

以上是关于解除B视图时未调用UITableView函数的主要内容,如果未能解决你的问题,请参考以下文章

在 UI 自动化测试中解除警报时未调用 UIAlertView 的委托方法“clickedButtonAtIndex”

使用 UITableView 时未调用 switch 语句案例

添加为另一个视图的子视图时未调用 touchesBegan 方法

当模态视图控制器被解除时如何调用函数

UITableviewcontroller 中的 UITableview - 重新加载时未调用 cellforrowatindexpath

重新加载表数据时未调用 CellForRowAtIndexPath