【问题标题】:[self.tableview reloadData]; causes flickering[self.tableview reloadData];导致闪烁
【发布时间】:2023-03-25 14:55:01
【问题描述】:

问题是 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 闪烁 .. 我提到了这个 stackoverflow.com/questions/11631104/… 但没有帮助

标签: ios tableview reloaddata


【解决方案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 中的任何内容都会显示出来。

    你可以:

    1. 清除 CollectionQueryResult 以便在您获得更新之前不会填充表格
    2. 比较CollectionQueryResultobjects,然后只更新数据发生变化的可见单元格(在设置CollectionQueryResult之前)

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

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

    【讨论】:

    • 我知道我需要这样做。 [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone]; 但这会产生错误: 'NSInternalInconsistencyException',原因:'无效更新:无效第 0 节中的行数。
    • 如何处理这个错误,因为我没有通过。手动行数
    • 委托方法中返回的行数。如果你更新CollectionQueryResult那么你需要根据CollectionQueryResult的新旧内容的不同来调用reloadRowsAtIndexPathsinsertRowsAtIndexPathsdeleteRowsAtIndexPaths
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2014-03-24
    • 2012-07-23
    相关资源
    最近更新 更多