Swift UITableView或UILabel在使用委托和协议观察者方法时发现为NIL,因为它是在viewDidLoad之前调用的

Swift UITableView或UILabel在使用委托和协议观察者方法时发现为NIL,因为它是在viewDidLoad之前调用的,swift,xcode,Swift,Xcode,我有一个名为APIController的类,我在其中保存所有网络功能并将响应保存在.plist文件中,我有LogInView和HomePageView,在LogInView中,当用户按下login按钮时,我调用一些功能,当用户数据成功接收时,应用程序进入主页,虽然更多的功能仍在后台运行,通过全局dispatchQueue下载更多与用户相关的数据,但现在在主页中,当数据下载完成时,我需要某种形式的观察者或通知,以便更新UI,我尝试了协议,但当我尝试更新UI时,我总是将所有UI设置为NIL,UITa

我有一个名为APIController的类,我在其中保存所有网络功能并将响应保存在.plist文件中,我有LogInView和HomePageView,在LogInView中,当用户按下login按钮时,我调用一些功能,当用户数据成功接收时,应用程序进入主页,虽然更多的功能仍在后台运行,通过全局dispatchQueue下载更多与用户相关的数据,但现在在主页中,当数据下载完成时,我需要某种形式的观察者或通知,以便更新UI,我尝试了协议,但当我尝试更新UI时,我总是将所有UI设置为NIL,UITableview,UITextView,一切为零

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

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


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

再次检查您的插座是否正确连接。并确保在调用
viewDidLoad
之前不会调用此命令。(如果是这样的话,你可以做
self.homeRosterTable?.reloadData()
)是的,我做了一些研究,现在我确定这是因为它在viewdidLoad之前被调用了,但我不知道如何解决它@rob就像我说的,添加可选的链接
,如上图所示,
self.homeRosterTable?.reloadData()
。当我这样做的时候,它从不重新加载@Rob