cellForRowAtIndexPath:未调用

我的应用程序有两个状态:login和未login,我有以下架构(大大简化):
– 包含一个search框和一个表视图的ViewController A.
– 用于login应用程序的ViewController B.

stream程如下:
– 用户未login;
– A被推入堆栈。 在viewWillAppear我检查用户是否login,如果是,则发出asynchronousnetworking请求,一旦完成,就会从networking中载入数据。 但由于用户此时尚未login,因此表视图为空;
– 用户点击search框; 因为他没有login,B被推(确认后);
– 他在B中成功login,然后按下popupB键并再次显示A的button;
– 在这个时候,因为他已经login了,从viewWillAppear我做asynchronous请求;
– 当完成时,我在表视图上调用reloadData

我注意到的是numberOfRowsInSection:被调用,它返回正确的结果,但是cellForRowAtIndexPath:不会被调用,表格保持为空。

我已经检查并在主线程上调用reloadData

任何想法是什么? 因为这让我疯狂!

谢谢,
S.

编辑:这是从A的viewWillAppear代码的asynchronous位

 if ([User isLoggedIn]) { [self.asyncRequest fetchDataWithCompletionHandler:^(id response, NSError *error) { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; if (error) { [Utils displayError:error]; } else { self.array = response; self.isLoaded = YES; [self.tableView reloadData]; [self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:NO]; } }]; } 

我已经检查了asynchronous请求成功完成,并且该response包含正确的数据(这是用于备份UITableView的数组)。

reloadData之后,我在tableView:numberOfRowsInSection:放置了一个断点tableView:numberOfRowsInSection:它停在那里,它返回array正确数目的元素。 之后,但是, tableView:cellForRowAtIndexPath:的断点永远不会被命中。

为什么要调用numberOfRowsInSection而不调用cellForRowAtIndexPath一个有效场景是当表的大小或位置不需要显示任何行时。

例如,假设您有一个20像素高的表格,但是第一部分的标题为30,并且返回了标头的nil(或者没有实现viewForHeaderInSection )。 在这种情况下,不会显示任何行,并且看上去就像表不在那里。

我看到你正在使用IB。 IB的大小在IB中可能是欺骗性的,因为它假定了页眉和页脚的大小。 我会logging表格的框架,以便您了解申请运行的位置(与IB中显示的位置相比较)。 我也一定要调用reloadData 之前手动调整表格的大小和位置。 这将解决这个有效的情况下cellForRowAtIndexPath不被调用。

检查numberOfSectionsInTableView没有返回0。

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } 

我有完全相同的问题,问题是我试图调用reloadData:从另一个线程。 解决办法是:

 dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); 
 // For others showing up on this questions via Google, etc. // Check and make sure you've set the table view's data source and delegate. self.tableView.dataSource = self; self.tableView.delegate = self; 

如果一个视图内部的表视图与Scrool View之类的东西冲突,它不会被调用。 您应该将视图板或* .xib文件中的视图分开。

 // True ▼ View ► Table View ► Scrool View ► Constraints // False ▼ View ► Scrool View ► Table View ► Constraints 

如果您正在使用不同的dataSource,请确保您保留了dataSource。 仅仅实例化将作为dataSource的类并通过tableView.dataSource = myDataClass分配将是不够的,因为tableView的dataSource属性很弱,并且在viewDidLoad完成时将被释放。 所有其他的方法都被调用 – 甚至令人惊讶的是, heightForRowAtIndexPath – 所以这花了我一些时间来debugging。

我正在使用ReactiveCocoa。 所以我创build了表视图的模型。 数据准备显示,所以numberOfRows等被调用。 但我没有添加tableview作为子视图,因此cellForRowAtIndexPath没有被调用)))

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Make sure self.data isn't nil! // If it is, you'll always return 0 and therefore // cellForRowAtIndexPath will never get called. return [self.data count]; } 

我解决了这个问题,因为我添加了uitableview我的子视图没有分配,所以它返回n和tableview不是调用cellforrowatindexpath但numberOfRowsInSection被调用

每个人都在谈论高度,但我的TableView在一个StackView的领先alignment结束了0宽度。

请确保使用Debug View Hierarchy检查您的TableView是否大小正确。

你确定在用户login后BpopupviewWillAppear中的viewWillAppear方法被调用以执行刷新?

如果将B显示为模态控制器,则在closures模式控制器时,将不会调用viewWillAppear方法。

据我所知, viewWillAppear/viewDidAppear (和其他喜欢它)是在导航事件(推/视图控制器)的情况下由UINavigationController生成的事件。 所以也许这就是为什么当你离开A并返回时你最终得到刷新的原因……这一切都取决于显示下一个视图控制器的方式。

尝试手动插入新行而不是[self.tableView reloadData]

 [self.tableView beginUpdates]; for (int i = 0; i < responseArray.count; i++) { _rowsNumber += 1; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom]; } [self.tableView endUpdates]; 

在dataSource方法中返回增加int _rowsNumber

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _rowsNumber; } 

我通过检查tableViewCell标识符来解决同样的问题。 转到属性İnspector并查看标识符部分。 可能是失踪了。 所以编写单元标识符。

我正在使用客户数据源,并已发布。 因为它是tableview的一个弱引用。

同样的情况在这里,但这是一个错误:

我在一个ViewController(devise需求)中包含了一个带有两个tablesView的滚动视图,在scrollview控制器中,我以编程的方式创build了ViewControllers(包含TableViews),并且使用了一个弱的var来存储它, 不好的想法,因为它们是在viewDidLoad方法。

如果你没有看到你的tableview内容,请检查它是否被释放。

我的错误对我来说是非常痛苦的,因为所有的方法(委托和数据源)被调用,除了viewForCell …

我有同样的问题,我已经使用表视图里面的StackView和表视图滚动禁用,并设置高度约束,但在那之后

 tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

不工作停止调用这个方法所有的Data SourceDelegate设置正确。

如果你有同样的问题比解决scheme是设置表视图底部,领导,尾随约束

在这里输入图像说明

检查numberOfRowsInSection不是0.有时它是0,没有人认出它。