swift - 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
解决方案
Mahmoud,据我了解,您的问题是您已经在 LoginViewController 和 HomeViewController 中声明了 ApiController 实例,并且两个对象都有不同的引用。您必须将相同的 apiController 引用传递给 LoginViewController 中使用的 homeViewController。
推荐阅读
- c# - 当存在显式引用类型时,C# 可以推断对象构造的通用参数吗?
- octave - 防止在八度脚本中打印输出而不在任何地方添加分号?
- c# - Msix,打包和任务调度器
- django - 在 admin 中上传文件,然后从 Django 网站下载
- c# - 正确配置 TCP 套接字中的 backlog
- python - Flask 进行计算返回错误的值
- javascript - 如何计算 iframe 的高度?
- python - 使用 BeautifulSoup 抓取网页
- c# - 升级到 .NET Framework 4.8 时的程序集绑定问题
- c# - ASP.NET MVC 无法在 HTTP 标头后重定向