[self.tableview reloadData];导致闪烁
Posted
技术标签:
【中文标题】[self.tableview reloadData];导致闪烁【英文标题】:[self.tableview reloadData]; causes flickering 【发布时间】:2014-04-26 14:22:12 【问题描述】:问题是 UI 出现然后更新:产生闪烁效果。
我希望用户界面只在用户进入应用程序时更新一次,因此我已经在 ViewDidLoad 中重新加载。这是代码。任何帮助如何消除这种闪烁...一些代码示例会有所帮助。
- (void)viewDidLoad
[super viewDidLoad];
self.myTableView.dataSource = self;
self.myTableView.delegate = self;
PFQuery * getCollectionInfo = [PFQuery queryWithClassName:@"Collection"]; // make query
[getCollectionInfo orderByDescending:@"updatedAt"];
[getCollectionInfo setCachePolicy:kPFCachePolicyCacheThenNetwork];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^
[getCollectionInfo findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
if (!error)
CollectionQueryResult = (NSMutableArray *)objects;
[self.tableView reloadData];
// whenevr get result
else
//no errors
];
);
【问题讨论】:
您的问题是什么,请详细说明您的问题。 问题是 UI 出现然后更新:产生闪烁效果。 我需要更新单元格,而不需要完整的 TableView 闪烁 .. 我提到了这个 ***.com/questions/11631104/… 但没有帮助 【参考方案1】:你为什么不简单地调用 reloadSections 方法而不是 [self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
【讨论】:
tableview 上的图像仍然在闪烁。【参考方案2】:参考cellForRowAtIndexPath
委托方法。您可能正在执行一些可能导致轻弹的操作。就我而言,我正在设置带有动画的图像视图的图像。所以每当我重新加载表格时,它都会因为那个动画而闪烁。
我删除了那个动画并为我工作..
【讨论】:
【参考方案3】:希望以下几行可以帮助您解决延迟和闪烁问题
dispatch_async(dispatch_get_main_queue()
, ^
[self.tableView reloadData];
);
【讨论】:
其实tableview默认只重新加载可见单元格 我知道我需要这样做。 '[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];' 但这会产生错误: 'NSInternalInconsistencyException',原因:'无效更新:第 0 节中的行数无效。 这将停止与后台线程相关的崩溃,但不会停止刷新闪烁【参考方案4】:您的下载是异步的,因此在显示视图之前不会完成。因此,CollectionQueryResult
中的任何内容都会显示出来。
你可以:
-
清除
CollectionQueryResult
以便在您获得更新之前不会填充表格
比较CollectionQueryResult
和objects
,然后只更新数据发生变化的可见单元格(在设置CollectionQueryResult
之前)
请注意,对于选项 2,您还需要比较 CollectionQueryResult
和 objects
的计数,然后根据需要从表视图中插入/删除行。选项 2 的重点是不要调用reloadData
,所以你需要做更多的工作......
如果您获得可见单元格并直接更新它们,您也可以避免调用reloadRowsAtIndexPaths
(这样可以避免发生任何动画)。见cellForRowAtIndexPath:
。
【讨论】:
我知道我需要这样做。[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];
但这会产生错误: 'NSInternalInconsistencyException',原因:'无效更新:无效第 0 节中的行数。
如何处理这个错误,因为我没有通过。手动行数
委托方法中返回的行数。如果你更新CollectionQueryResult
那么你需要根据CollectionQueryResult
的新旧内容的不同来调用reloadRowsAtIndexPaths
、insertRowsAtIndexPaths
和deleteRowsAtIndexPaths
以上是关于[self.tableview reloadData];导致闪烁的主要内容,如果未能解决你的问题,请参考以下文章
将 Subview 添加到 self.tableView.tableHeaderView 不起作用
self.tableView.indexPathForCell(cell) 返回错误的单元格?
Xcode Swift 4 调用 self.tableView.reload() 以减少单元格行数
[self.tableview reloadData];导致闪烁