Ste*_*ncu 66 iphone uitableview ios
我的应用程序有两种状态:登录和未登录,我有以下架构(大大简化):
- ViewController A包含一个搜索框和一个表视图.
- ViewController B,用于登录应用程序.
流程如下:
- 用户未登录;
- A被推入堆栈.在viewWillAppear
我检查,如果用户在如果是,一个异步网络请求正在取得,一旦做到这一点登录,该表加载来自网络的数据.但是,由于此时用户未登录,因此表视图为空;
- 用户点击搜索框; 因为他没有登录,B被推(确认后);
- 他在B中成功登录,然后按下弹出B的按钮并再次显示A;
- 在这个时间点,因为他已登录,从viewWillAppear
我做异步请求;
- 完成后,我调用reloadData
表格视图.
我注意到的numberOfRowsInSection:
是调用它并返回正确的结果,但cellForRowAtIndexPath:
之后不会调用它并且表保持为空.
我已经检查并reloadData
在主线程上调用了.
知道它能是什么吗?因为它让我疯了!
谢谢,
S.
编辑:这是viewWillAppear
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];
}
}];
}
Run Code Online (Sandbox Code Playgroud)
我已经检查过异步请求是否成功完成并且response
包含正确的数据(这是用于支持的数组UITableView
).
之后reloadData
,我放了一个断点tableView:numberOfRowsInSection:
,它停在那里,它返回正确数量的元素array
.然而,在那之后,断点tableView:cellForRowAtIndexPath:
就永远不会被击中.
Joe*_*oel 254
为什么numberOfRowsInSection
会被调用但cellForRowAtIndexPath
不会被调用的一个有效方案是当表的大小或位置不需要显示任何行时.
例如,假设你有一个20像素高的表,但是第一部分的标题是30高,你为标题返回nil(或者没有实现viewForHeaderInSection
).在这种情况下,不会显示任何行,看起来就像表中没有行.
我看到你正在使用IB.表中的大小可以在IB中具有欺骗性,因为它假设页眉和页脚大小.我会记录表的框架,以便您了解应用程序运行时的位置(与IB中出现的位置相比).我还要确保在调用reloadData 之前手动调整表格框架的大小和位置.这将解决cellForRowAtIndexPath
未调用的有效情况.
Pet*_*lly 41
检查numberOfSectionsInTableView
是否没有返回0.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
Run Code Online (Sandbox Code Playgroud)
Nik*_*kov 24
我有完全相同的问题,问题是我试图从另一个线程调用reloadData:解决方案是:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
Run Code Online (Sandbox Code Playgroud)
ava*_*nce 13
如果您使用的是其他数据源,请确保保留dataSource.仅仅实例化将成为dataSource并通过其分配的类tableView.dataSource = myDataClass
是不够的,因为tableView的dataSource属性很弱并且将在viewDidLoad完成时释放.所有其他方法都被我调用 - 甚至,令人惊讶的是heightForRowAtIndexPath
- 所以这花了我一些时间来调试.
Joh*_*rck 12
// 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;
Run Code Online (Sandbox Code Playgroud)
小智 10
如果视图中的表视图与Scrool View之类的内容发生冲突,则不会调用它.您应该在Storyboard或*.xib文件中分隔视图.
// True
? View
? Table View
? Scrool View
? Constraints
// False
? View
? Scrool View
? Table View
? Constraints
Run Code Online (Sandbox Code Playgroud)
如果您像我一样使用自动布局并将 tableview 添加到视图控制器的视图中,请确保在分配 table view 时添加了这一行。
tableView?.translatesAutoresizingMaskIntoConstraints = false
Run Code Online (Sandbox Code Playgroud)
我这边犯了愚蠢的错误。
小智 5
我们有相同/相似的问题。代码达到了numberOfSections
和numberOfRowsInSection
(甚至返回了值)但无法达到cellForRowAt
。当时,Storyboard 中的 Table View 只有右侧、左侧和顶部的约束,而没有底部的约束。一旦我们在底部添加约束,它就像一个魅力。
因此,请检查您是否为 Table View 提供了所有需要的约束。
您确定在用户登录并弹出 B 后,viewWillAppear
会调用 A 中的方法来执行刷新吗?
如果将 B 显示为模态控制器,则当您关闭它时,将不会调用该viewWillAppear
方法。
据我所知,viewWillAppear/viewDidAppear
(以及其他类似的)是 UINavigationController 在导航事件(推送/弹出视图控制器)的情况下生成的事件。所以也许这就是为什么当你离开 A 并返回时你最终会得到刷新......这一切都取决于显示下一个视图控制器的方式。