Iphone cellForRowAtIndexPath:未调用
我的应用程序有两种状态:已登录和未登录,我有以下架构(大大简化):Iphone cellForRowAtIndexPath:未调用,iphone,ios,uitableview,Iphone,Ios,Uitableview,我的应用程序有两种状态:已登录和未登录,我有以下架构(大大简化): -包含搜索框和表视图的视图控制器。 -用于登录应用程序的ViewController B 流程如下: -用户未登录 -在堆栈上按下一个按钮。在视图中将出现中,我检查用户是否已登录,如果已登录,则会发出异步网络请求,完成后,会将网络数据加载到表中。但是,由于用户此时未登录,表视图为空 -用户点击搜索框;因为他没有登录,B被按下(在确认之后) -他在B中成功登录,然后按下一个按钮,弹出B并再次显示a -此时,由于他已登录,因此从视图
-包含搜索框和表视图的视图控制器。
-用于登录应用程序的ViewController B 流程如下:
-用户未登录
-在堆栈上按下一个按钮。在
视图中将出现
中,我检查用户是否已登录,如果已登录,则会发出异步网络请求,完成后,会将网络数据加载到表中。但是,由于用户此时未登录,表视图为空-用户点击搜索框;因为他没有登录,B被按下(在确认之后)
-他在B中成功登录,然后按下一个按钮,弹出B并再次显示a
-此时,由于他已登录,因此从
视图将出现
我执行异步请求-完成后,我在表视图上调用
reloadData
我注意到调用了numberOfRowsInSection:
,它返回了正确的结果,但是之后没有调用cellforrowatinexpath:
,表仍然为空
我已经检查并在主线程上调用了reloadData
知道会是什么吗?因为它快把我逼疯了
谢谢,美国 编辑:下面是
视图中的异步代码位将出现在A中
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];
}
}];
}
我已检查异步请求是否成功完成,以及响应是否包含正确的数据(这是用于支持UITableView
的数组)
在reloadData
之后,我在tableView:numberofrowsinssection:
中放置了一个断点,它在那里停止,并返回数组中正确的元素数。但是,在此之后,tableView:cellForRowAtIndexPath:
中的断点将永远不会命中。您确定在用户登录并弹出B之后,视图将在调用A的方法中出现
以执行刷新吗
如果将B显示为模态控制器,则当您取消它时,将不会调用视图
据我所知,viewwillbeen/viewdidabeen
(以及其他类似内容)是由UINavigationController在导航事件(push/pop viewcontrollers)情况下生成的事件。
所以,也许这就是为什么当你离开A回来时,你最终会得到更新。。。这完全取决于显示下一个viewcontroller的方式。当表的大小或位置不需要显示任何行时,将调用numberOfRowsInSection
但不会调用cellForRowAtIndexPath
的一个有效场景
例如,假设您有一个20像素高的表,但是第一个部分的标题是30像素高,并且您为标题返回了nil(或者没有实现viewForHeaderInSection
)。在这种情况下,将不显示任何行,并且看起来该表不存在
我看到您使用的是IB。IB中的表大小可能具有欺骗性,因为它假定页眉和页脚的大小。我将记录表的框架,以便您了解应用程序运行时它在哪里(而不是它在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];
});
尝试手动插入新行,而不是[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];
我用的是反作用可可粉。因此,我为表视图创建了模型。数据准备显示,因此调用了numberOfRows
等。但我没有将tableview添加为子视图,因此,cellforrowatinexpath
没有被调用))我解决了这个问题,因为我添加了UITableView
的子视图没有被分配,所以它返回nill,而tableview没有调用cellforrowatinexpath
,但是如果视图中有一个表视图,就会调用numberofrowsinssection这与Scrool视图类似,它没有调用。您应该在故事板或*.xib文件中分隔视图
// True
▼ View
► Table View
► Scrool View
► Constraints
// False
▼ View
► Scrool View
► Table View
► Constraints
我通过检查tableViewCell标识符解决了同样的问题。转到属性检查器并查看标识符部分。可能是不见了。因此,请编写单元标识符。如果您使用的是不同的数据源,就像我一样,请确保保留该数据源。仅仅实例化将成为数据源的类并通过tableView.dataSource=myDataClass
分配它是不够的,因为tableView的dataSource属性很弱,并且将在viewDidLoad完成时释放。所有其他方法都是为我调用的,甚至令人惊讶的是,heightforrowatinexpath
,所以我花了一些时间进行调试。我正在使用一个客户数据源,它已经发布了。因为它是tableview的一个弱引用。每个人都在谈论高度,但我的tableview
在StackView
中的前导对齐以0宽度结束
确保使用调试视图层次结构检查您的表视图的大小是否正确,但这是一个错误:
我在一个ViewController(设计要求)中包含了一个带有2个表视图的Scrollview,在Scrollview控制器中,我通过编程创建了ViewController(包含表视图),并使用了弱var来存储它,坏主意,因为它们是在ViewDiLoad方法结束时发布的
// 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;
- (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];
}
// True
▼ View
► Table View
► Scrool View
► Constraints
// False
▼ View
► Scrool View
► Table View
► Constraints
tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
myTableView.translatesAutoresizingMaskIntoConstraints = false
_scanResultTable.delegate = self;
_scanResultTable.dataSource = self; // self's lifecycle was fine, wasn't getting released
[_scanResultTable reloadData];