2014-04-26 96 views
5

问题是用户界面出现,然后得到更新:给闪烁的影响。[self.tableview reloadData];导致闪烁

我希望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 
     } 


    }]; 
}); 
+0

您的问题是什么,请详细说明您的问题。 – iPatel

+0

问题是用户界面出现,然后得到更新:给闪烁的影响。 – user3576169

+0

我需要单元格更新没有完整的TableView闪烁..我提到这个http://stackoverflow.com/questions/11631104/uitableview-reloaddata-how-to-stop-flicker但没有帮助 – user3576169

回答

1

希望下面的线可以帮助你延缓和闪烁问题

dispatch_async(dispatch_get_main_queue() 
        , ^{ 
[self.tableView reloadData]; 

}); 
+0

仍然闪烁.. – user3576169

+0

其实tableview只重新加载可见单元默认 –

+1

**我明白我需要做到这一点。**'[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];' **但是,这给出了一个错误:**'NSInternalInconsistencyException',原因:'无效的更新:在0节的行数无效。 – user3576169

1

您的下载是异步的,所以显示的视图之前不会完成。所以,无论你在CollectionQueryResult都会显示。

你既可以:

  1. 清除CollectionQueryResult所以表中没有填充,直到你得到一个更新
  2. 比较CollectionQueryResultobjects,然后更新只有在数据发生变化可见单元格(前设置CollectionQueryResult

注意,对于选项2,你还需要比较CollectionQueryResultobjects计数,然后插入/删除[R酌情从表格视图中删除。选项2的全部要点是不要拨打reloadData,因此您需要做更多的工作...

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

+0

**我明白我需要这样做。**'[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];' **但是给出了一个错误:**'NSInternalInconsistencyException',原因:'无效的更新:无效的数字第0节中的行。 – user3576169

+0

如何处理这个错误,因为我不通过没有。手动设置行数 – user3576169

+0

在委托方法中返回行数。如果你更新'CollectionQueryResult',那么你需要基于'CollectionQueryResult'的新旧内容的区别来调用'reloadRowsAtIndexPaths','insertRowsAtIndexPaths'和'deleteRowsAtIndexPaths' – Wain

3

为什么不直接调用reloadSections方法而不是[self.tableView reloadData];

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 
2

请参阅cellForRowAtIndexPath委托方法。您可能正在做一些可能导致轻弹的操作。就我而言,我正在用动画设置图像视图的图像。所以无论何时重新加载表格,由于该动画都会闪烁。

我删除了该动画并为我工作..