在调用“ tableView.reloadData()”之后,TableView无法重新加载

时间:2019-08-02 09:09:11

标签: ios swift uitableview notificationcenter

我有两个标签。第一个选项卡包含一个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?

2 个答案:

答案 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)
}

唯一的缺点是视图控制器将被重置为其初始状态,即,如果视图控制器中的表视图向下滚动,则当用户从设置返回到视图控制器时,表视图为重置为其最高位置,并且不显示其滚动到的位置。