如何刷新 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];
现在足以强制刷新。
我在一个更大的项目中,该项目使用 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];
现在足以强制刷新。