[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 以便在您获得更新之前不会填充表格 比较CollectionQueryResultobjects,然后只更新数据发生变化的可见单元格(在设置CollectionQueryResult之前)

请注意,对于选项 2,您还需要比较 CollectionQueryResultobjects 的计数,然后根据需要从表视图中插入/删除行。选项 2 的重点是不要调用reloadData,所以你需要做更多的工作......

如果您获得可见单元格并直接更新它们,您也可以避免调用reloadRowsAtIndexPaths(这样可以避免发生任何动画)。见cellForRowAtIndexPath:

【讨论】:

我知道我需要这样做。 [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone]; 但这会产生错误: 'NSInternalInconsistencyException',原因:'无效更新:无效第 0 节中的行数。 如何处理这个错误,因为我没有通过。手动行数 委托方法中返回的行数。如果你更新CollectionQueryResult那么你需要根据CollectionQueryResult的新旧内容的不同来调用reloadRowsAtIndexPathsinsertRowsAtIndexPathsdeleteRowsAtIndexPaths

以上是关于[self.tableview reloadData];导致闪烁的主要内容,如果未能解决你的问题,请参考以下文章

将 Subview 添加到 self.tableView.tableHeaderView 不起作用

self.tableView.indexPathForCell(cell) 返回错误的单元格?

Xcode Swift 4 调用 self.tableView.reload() 以减少单元格行数

[self.tableview reloadData];导致闪烁

隐藏 UIView 后如何重置 tableview 内容高度

[self.tableView scrollToRowAtIndexPath:]方法滑动崩溃