选中UITableView行后数据未清除,reloadData无效求助
看起来你的代码思路是对的,但可能有几个细节导致表格数据没被清除,我帮你梳理下常见的排查方向:
确认
searchResult是表格的真正数据源
先检查你的表格数据源方法,比如tableView:numberOfRowsInSection:是不是返回searchResult.count。如果你的表格实际用的是另一个数组作为数据源,那清空searchResult自然不会影响表格显示。比如如果数据源是originalDataArray,那你需要清空的是这个数组而不是searchResult。确保在主线程执行表格刷新
UI操作必须在主线程完成,虽然didSelectRowAtIndexPath:本身是在主线程触发的,但如果你的searchResult之前有在子线程操作的情况,或者刷新被延迟了,可以明确将reloadData放到主线程执行:[searchResult removeAllObjects]; dispatch_async(dispatch_get_main_queue(), ^{ [self.tblViewSearch reloadData]; });检查是否有其他代码重新填充了
searchResult
比如你的搜索框可能有textDidChange回调,或者某个网络请求回调里,在你清空数组后又重新把数据加回来了。可以在removeAllObjects之后加一句日志:NSLog(@"After removeAll, searchResult count: %lu", (unsigned long)searchResult.count);看看打印出来的数值是不是0,如果是0但表格还显示数据,那大概率是数据源不对;如果不是0,说明有其他地方在修改这个数组。
尝试手动删除表格行再清空数组
有时候直接调用reloadData可能因为表格缓存或者动画问题没生效,你可以试试先删除可见行,再清空数组:[self.tblViewSearch beginUpdates]; NSArray *visibleIndexPaths = [self.tblViewSearch indexPathsForVisibleRows]; if (visibleIndexPaths.count > 0) { [self.tblViewSearch deleteRowsAtIndexPaths:visibleIndexPaths withRowAnimation:UITableViewRowAnimationFade]; } [self.tblViewSearch endUpdates]; [searchResult removeAllObjects];这个方法会直接移除表格上显示的行,再配合清空数据源,效果会更直接。
先从第一个方向排查,数据源不匹配是最常见的原因,应该能快速解决你的问题。
内容的提问来源于stack exchange,提问作者jeetendra_coder

