【发布时间】:2021-08-30 16:42:35
【问题描述】:
当 TaskListDataSource 的回调被调用时,它会重新加载 todayVC 和 reviewVC,因为它们是 UITableViewControllers。然而 plannerVC 不是,tableview 属性是一个出口。
@IBOutlet weak var tableView: UITableView!
为什么当回调运行时它崩溃说它是零。但是,如果我能够以某种方式在页面视图中滚动并查看 plannerVC,则它永远不会崩溃,因为 tableview 已加载到内存中。但为什么一开始不这样做呢?
override func viewDidLoad() {
super.viewDidLoad()
let taskListDataSource = TaskListDataSource {
self.todayVC.tableView.reloadData()
self.plannerVC.tableView.reloadData()
self.reviewVC.tableView.reloadData()
}
todayVC = storyboard!.instantiateViewController(identifier: "TodayViewController", creator: { coder in
return TodayViewController(coder: coder, taskListDataSource: taskListDataSource)
})
plannerVC = storyboard!.instantiateViewController(identifier: "PlannerViewController", creator: { coder in
return PlannerViewController(coder: coder, taskListDataSource: taskListDataSource)
})
reviewVC = storyboard!.instantiateViewController(identifier: "ReviewViewController", creator: { coder in
return ReviewViewController(coder: coder, taskListDataSource: taskListDataSource)
})
addVC = storyboard!.instantiateViewController(identifier: "AddViewController")
setViewControllers([todayVC], direction: .forward, animated: false)
dataSource = self
print(plannerVC.tableView) // Console is printing nil
}
【问题讨论】:
-
您正试图在
TaskListDataSource的初始化中访问self.plannerVC.tableView,但您的plannerVC被设置了两个语句之后。 -
即使您修复了 Alexander 所说的“访问顺序”,您也确实实例化了它们,但即使 IBOutlet 已在 Storyboard 中正确连接,它也尚未加载。您可以使用
plannerVC.loadView()强制加载它 -
@Larme 我阅读了苹果提供的关于
loadView()函数的文档,第一行声明了You should never call this method directly.,所以我改为调用loadViewIfNeeded(),它已经解决了这个问题。这让人怀疑这是否是我面临的问题的唯一解决方案。 -
确实,
loadViewIfNeeded()而不是loadView(),我的错。对于您的问题,您正在尝试访问尚未加载的 ViewController 的IBOutlet。您可以稍后访问 IBOutlet,还是现在需要它?这是个大问题,这取决于你的架构...... -
@Larme 我有一个包含两个 UITableViewControllers 的 UIPageViewController(可以从这些控制器访问 tableview),然后我有一个带有 tableview 插座的 UIViewController。这些都在 UIPageViewController 的 viewDidLoad 函数中初始化。我在 UIPageController 中定义了一个闭包,它本质上是在发生更改时重新加载所有 tableviews - 这确保所有 UI 都是同步的。但它崩溃导致 UIViewController 中的 tableview 为 nil