首页 > 解决方案 > UITableView 或 UILabel 在使用委托和协议观察者方法时发现 NIL,因为它在 viewDidLoad 之前调用

问题描述

我有一个名为 APIController 的类,我在其中保留所有网络功能并将响应保存在 .plist 文件中,并且我有 LogInView 和 HomePageView,在 loginView 中,当用户按下登录按钮以及成功接收到用户数据时,我会调用一些函数,应用程序转到主页,而更多功能仍在后台运行,使用全局 dispatchQueue 下载更多与用户相关的数据,现在在主页中,当数据下载完成时,我需要某种观察者或通知,这样我就可以更新 UI,我尝试过协议,但是当我尝试更新 UI 时,我总是将所有 UI 设为 NIL、UITableview、UITextView,一切都为零。

经过研究,我发现它是因为它在 viewDidLoad 之前被调用,并且知道如何解决它?

class HomePageViewController:  UIViewController, UITableViewDelegate, UITableViewDataSource  {

    let apiController = APIController()

    override func viewDidLoad() {
        super.viewDidLoad()

        apiController.homePageDelegate = self

        homeRosterTable.delegate = self
        homeRosterTable.dataSource = self
        homeRosterTable.register(UINib(nibName: "RosterCell", bundle: nil), forCellReuseIdentifier: "customRosterCell")
    }
}

extension HomePageViewController: HomePageDelegate {

    func readyToLoadData() {

        apiController.loadRoster { (roaster) in
            DispatchQueue.global(qos: .background).async {

                self.flightList = roaster



                //   if self.nextDepFrom != nil {
                self.nextDepFrom?.text = "MOZ"
                DispatchQueue.main.async {
                    self.homeRosterTable.reloadData()
                }
                //}
            }
        }
    }
}

protocol LogInDelegate {
    func logInObserver(success: Bool, msg: String)
}
protocol HomePageDelegate {
    func readyToLoadData()
}

class APIController {

    var logInPage : LogInViewController?
    var logInDelegate : LogInDelegate?
    var homePageDelegate : HomePageDelegate?
}

线程 1:致命错误:在隐式展开可选值时意外发现 nil

标签: swiftxcode

解决方案


Mahmoud,据我了解,您的问题是您已经在 LoginViewController 和 HomeViewController 中声明了 ApiController 实例,并且两个对象都有不同的引用。您必须将相同的 apiController 引用传递给 LoginViewController 中使用的 homeViewController。


推荐阅读