numberOfRowsInSection:未在 reloadData 上调用
Posted
技术标签:
【中文标题】numberOfRowsInSection:未在 reloadData 上调用【英文标题】:numberOfRowsInSection: not called on reloadData 【发布时间】:2012-07-13 10:46:16 【问题描述】:我有一个UITableView
,它使用数组来列出数据。这工作正常。
我还有一个UISearchBar
用于在那个tableview
中搜索。当 tableviews 数组中的数据匹配时,这些行被添加到另一个可变数组中,cellForRowAtIndexPath:
显示来自该可变数组的数据。
但是当我调用 reloadData 时,永远不会调用 numberOfRowsInSection:
。因此,tableview
在滚动时崩溃,因为它试图从可变数组中获取数据,但是对于原始数组中的行(其中包含更多项)
我已经调试了很长时间,但看在上帝的份上,找不到原因。 Datasource 和 Delegate 在tableview
中挂钩,因为它可以显示原始数组中的数据。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSLog(@"isSearching: %d", isSearching);
// Return the number of rows in the section.
if(!isSearching)
return [originalArray count];
NSLog(@"isSearching - Return searchCopyListOfItems");
return [searchCopyListOfItems count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
if(!searching)
cell.textLabel.text = [originalArray objectAtIndex:indexPath.row];
else
cell.textLabel.text = [searchCopyListOfItems objectAtIndex:indexPath.row];
return cell;
【问题讨论】:
重新加载时检查表是否有内存.. 【参考方案1】:如果numberOfSections
返回0
,则不会调用numberOfRowsInSection
。
【讨论】:
这是给我的! TYVM【参考方案2】:确保不要从任何表视图的委托方法中调用reloadData
。这将导致不可预测的行为。另外,请确保您之前没有调用过beginUpdates
,并且您只在主线程中调用了您的reloadData
方法。
【讨论】:
感谢有关beginUpdates
的提示!【参考方案3】:
你如何重新加载你的表?
做[table relaodData];
对吗?
您的桌子是否连接到您笔尖上的 IBOutlet?
在重新加载时,table
是否已初始化?
您也可以发布崩溃信息。
【讨论】:
感谢您的提示。不知何故,IB 已将 IBOutlet 与 xib 中的 UITableView 断开连接。我没有注意到它没有连接,因为原始数据显示成功。然而,事后看来,我意识到这不是因为引用出口,而是因为委托和数据源连接 我犯了同样的错误,我忘记将数据源出口连接到视图控制器。【参考方案4】:我今天在使用 XCode 6.1 时遇到了同样的问题
在我的代码中,我设置了 dataSource
和 delegate
:
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
self.tableView.dataSource = self;
self.tableView.delegate = self;
...奇怪的是,我的代码在第一次加载时会填充表格...但随后它忽略了对reloadData
的任何调用。
在情节提要中,当我右键单击情节提要中的表格视图时,它的“出口”单选按钮是一个空圆圈。
我从这个空圆圈拖了一条线到父UIView
,然后然后reloadData
工作正常。
不知何故,我丢失了 UITableView 控件和用于填充它的 .h/.m 文件之间的 IBOutlet
链接。
【讨论】:
【参考方案5】:还要确保您在重新加载数据的过程中没有移动表,因为它可能会在您仍在更新数据时调用cellForRowAtIndexPath:
。
【讨论】:
【参考方案6】:对我来说问题是,被截断的节数返回 0,即使我不打算使用节,也必须有 1,因为它在对象层次结构中高于行:https://***.com/a/26632808/1449799
【讨论】:
【参考方案7】:对我来说,问题是我试图增加一个值并从numberOfSectionsInTableView
返回它
即return someValue++
显然这是不可能的,在我的例子中,它没有将 someValue
从 0 增加到 1,因此返回 0 个部分,因此没有理由调用 numberOfRowsInSection:
!
【讨论】:
【参考方案8】:我的解决方案是我从另一个笔尖复制粘贴它,忘记重新连接 IB 中的 dataSource
和 delegate
插座。我以前也遇到过这种情况,但我想我会把它贴在这里,以防这个解决方案帮助一些遇到这个问题的人。
【讨论】:
【参考方案9】:试试
[self.tableView reloadData];
【讨论】:
以上是关于numberOfRowsInSection:未在 reloadData 上调用的主要内容,如果未能解决你的问题,请参考以下文章
对成员 '(_:numberOfRowsInSection:)' 的模糊引用
数组未与 tableView(numberOfRowsInSection) 方法连接
numberOfRowsInSection:核心数据和多个部分的方法