为什么我必须调用viewWillAppear来获取cellForRowAtIndexPath?

时间:2013-11-27 19:41:22

标签: ios objective-c

当测试从故事板加载的UITableViewController子类时,cellForRowAtIndexPath将返回nil ,除非我:A)发送它viewWillAppear:YES或B)获取tableView.numberOfSections。

这是为什么?为什么不在主线程上访问视图或发送loadView选择器呢?

SpecBegin(CustomerViewController)
  describe(@"CustomerViewController", ^{

    __block CustomerViewController *_vc;

    beforeEach(^{
      NSLog(@"Before Each");
      UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"Storyboard_Pad" bundle:nil];
      _vc = (CustomerViewController *)[mainstoryboard     instantiateViewControllerWithIdentifier:@"customer"];
    });

    it(@"the first cell should be the fullName cell", ^{
      // Following line is needed to make the following tests pass.
      [_vc viewWillAppear:YES];
      UITableViewCell *cell = [_vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
      expect(cell.reuseIdentifier).to.equal(@"fullName");
    });

  });

SpecEnd

2 个答案:

答案 0 :(得分:1)

看起来你是单元测试UI代码。我通常建议不要这样做,因为您将手动尝试模拟ViewController生命周期方法,以便关闭以重现您的UI在正在运行的应用程序中的行为。

我建议尝试两件事:

  1. 对您的模型/逻辑进行单元测试(例如,您的表视图正在使用的数据)。
  2. 如果您必须测试用户界面,我建议您使用Xcode查看Automated Testing

答案 1 :(得分:0)

事实证明,使用视图控制器方法可以直接在表视图对象上工作,但不能直接使用方法。通过视图控制器执行此操作时,无需调用viewWillAppear

这有效:

[_vc tableView:_vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

这不是

[_vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];