我有两个标签。第一个选项卡包含一个UITableViewController
,其tableView的单元格包含一些单词。第二个选项卡用于设置,包含一个tableView以及一个用于设置字体大小的单元格。用户点击单元格后,用户将进入更改字体大小的界面。当用户按下“保存”按钮(“编辑字体大小”界面中的一个按钮以保存调整后的字体大小。)时,顶视图控制器会弹出回到原始tableView进行设置。
按下保存按钮时,我使用观察者发布通知,各个观察者将更新其视图。我在tableView中添加了一个观察者进行设置,并且它可以工作。弹出用于编辑字体大小的顶视图控制器时,原始tableView会显示调整后的字体大小。
但是,当我在第一个标签的UITableViewController
中添加观察者时,不会重新加载tableView。我在NotificationCenter.default.addObserver(_:selector:name:object:)
的选择器方法中添加了打印消息,并确认调用了选择器方法。选择器方法如下所示:
@objc func reloadTableView() {
print("The method is called.")
tableView.reloadData()
}
我在第一个标签的tableView单元格中使用字体大小的代码:
labelOne.font = UIFont(descriptor: fontDescriptor, size: fontSizeForLabelOne)
labelTwo.font = UIFont(descriptor: fontDescriptor, size: fontSizeForLabelTwo)
对我来说,这似乎很令人困惑,因为调用了重载tableView的方法,但是还没有重载表视图吗?而且由于字体大小已更改,因此当我滚动tableView时,新单元格将随机以旧字体大小或调整后的字体大小显示。
我也尝试过使用标签,即使在其他标签中也可以在标签上使用。换句话说,我认为问题只发生在tableView上。
另一方面,由于它适用于“设置”选项卡中的表格视图,我是否可以说只有在要显示表格视图时调用tableView.reloadData()
时才能重新加载表格视图?如果未显示tableView并调用了tableView.reloadData()
,将不会发生任何事情,并且一切保持不变?
简而言之,当我更改字体大小时,是否有任何方法可以确保重新加载tableView?
答案 0 :(得分:0)
尝试
@objc func reloadTableView() {
print("The method is called.")
DispatchQueue.main.async {
tableView.reloadData()
}
}
希望这会起作用。
答案 1 :(得分:0)
最终,我找到了一个解决方案,因为我的视图控制器是由导航控制器管理的,所以我弹出视图控制器,然后再次加载它,作为重新加载表格视图的替代方法。即
@objc func reloadTableView() {
navigationController.popViewController(animated: false)
navigationController.pushViewController(theViewController, animated: false)
}
唯一的缺点是视图控制器将被重置为其初始状态,即,如果视图控制器中的表视图向下滚动,则当用户从设置返回到视图控制器时,表视图为重置为其最高位置,并且不显示其滚动到的位置。