如何刷新 TableView 单元格

How to refresh TableViewCells

我在一个更大的项目中,该项目使用 Cedar 框架进行单元测试。我正在为包含 UITableView.

的视图编写单元测试

初始化:

subject = [[ControllerWithTableView alloc] initWithParams:params];
navigationController = [[UINavigationController alloc] initWithRootViewController:subject];

然后我设置一些东西然后调用:

[subject: viewWillAppear:NO];

在测试中,我可以在 indexPaths 等处请求单元格。 这背后的主要思想是它运行时不会让 UI 有太多时间来设置。

在一些测试中我不得不添加:

[subject.view layoutIfNeeded];

然后然后它起作用了。

但在当前测试中,我添加了一个新的 tableViewRow,其方法与在运行时调用的方法相同。但是我无法通过重新加载 UITableView 来创建新的行和单元格来测试它。

Here建议使用:

#define tickRunLoop (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.01, false))

有效。但有时它会崩溃。不仅没有通过一项测试,而且使 运行 单元测试的过程崩溃。所以其他所有测试都没有运行结束。我无法将不稳定的代码推送到客户的存储库,所以这不是一个选项...

如果相关的话,我正在使用 XCode 8.3.3。

我还能做些什么来强制刷新?

好吧,是我的错。我有

dispatch_async(dispatch_get_main_queue(), ^{
    // stuff
});

在我的代码中(或者至少在项目中。这不是我的代码:P)。 所以测试比应该测试的代码的执行速度更快。始终小心异步内容!

在所有情况下 [subject.view layoutIfNeeded]; 现在足以强制刷新。