UITableView 重新加载时闪烁

Posted

技术标签:

【中文标题】UITableView 重新加载时闪烁【英文标题】:UITableView flashes when reloaded 【发布时间】:2013-10-31 18:17:27 【问题描述】:

在我的 UIViewController 上,我有一个 UIView 和一个 UITableView。 UIView 充当加载屏幕,而我的 XML Parser (RaptureXML) 正在解析表数据。完成后,它会在 UITableView 中显示数据。

但是,当我运行应用程序并导航到不同的视图控制器然后返回时,UITableView 会因[self.tableView reloadData]; 而闪烁,如果我将其取出,它不会显示表中的数据。我可以把它移到别的地方吗?

@interface OffersViewController ()

@end

@implementation OffersViewController
@synthesize loadingView;

MoreCobaltOffers *currentFeed;
AppDelegate *appDelegate;

- (void)viewDidAppear:(BOOL)animated

[self.tableView addSubview:loadingView];

self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Navigation"]];

CustomStringParser *customStringParser = [[CustomStringParser alloc] init];

// Download and parse XML data
RXMLElement *rxml = [RXMLElement elementFromXMLData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.morecobalt.co.uk/rss/?t=offers"]]];

// Create an reference to AppDelegate
appDelegate = [[UIApplication sharedApplication] delegate];

// Create an array to store each feed
appDelegate.offersFeeds = [[NSMutableArray alloc] init];

// Loop Through XML Data
[rxml iterate:@"channel" usingBlock:^(RXMLElement *supportElement) 

    [supportElement iterate:@"item" usingBlock:^(RXMLElement *repElement) 

        // Assign element to string
        NSString *title = [repElement child:@"title"].text;
        NSString *subtitle = [repElement child:@"tagline"].text;
        NSString *description = [repElement child:@"description"].text;
        NSString *imageurl = [repElement child:@"image"].text;
        NSString *address = [repElement child:@"address"].text;

        // Assign element value to MoreCobalt.h propertys
        currentFeed = [MoreCobaltOffers alloc];
        currentFeed.title = title;
        currentFeed.imageurl = imageurl;
        currentFeed.addressline = address;

        // DESCRIPTION FORMATTING
        description = [customStringParser parsehtml:description];
        description = [customStringParser parseLinesMultiple:description];
        description = [customStringParser removeSocialSignifiers:description];
        description = [customStringParser appendTermsOfUse:description];
        currentFeed.description = description;

        // SUBTITLE FORMATTING
        subtitle = [customStringParser parseHTML:subtitle];
        subtitle = [customStringParser parseLinesSingle:subtitle];
        subtitle = [customStringParser removeSocialSignifiers:subtitle];
        currentFeed.subtitle = subtitle;

        // Add a new object to the feeds array
        [[appDelegate offersFeeds] addObject:currentFeed];
    ];
    [loadingView removeFromSuperview];
    [self.tableView reloadData];
];

【问题讨论】:

当你在一个块中添加代码时,这段代码在另一个线程中执行,视图被设置为隐藏快速,但是如果你注释[loadingView setHidden:YES];必须显示视图。 是的,没错。如果您评论 [loadingView setHidden:YES];显示视图。您建议我们如何克服这个问题? 找到管理blockCompletion的正确方法并将这段代码放入其中。 你知道怎么做吗? 我从未使用过 RXMLElement,抱歉 :( 【参考方案1】:

您在 TableView 之前添加视图。只需在界面生成器中更改顺序即可。

这是您查看的层次结构:

View
  View
     GrayActivity Indicator
     Label  - Loading
  Table View
    TableViewCell

假设是这样的:

View
  Table View
    TableViewCell
  View
     GrayActivity Indicator
     Label  - Loading

编辑

请删除此行 `[loadingView setHidden:YES];将您的代码更新为以下内容:

[rxml iterate:@"channel" usingBlock:^(RXMLElement *supportElement) 

      [supportElement iterate:@"item" usingBlock:^(RXMLElement *repElement) 

         .
         .
         .

      [[appDelegate offersFeeds] addObject:currentFeed];
   ];
   dispatch_sync(dispatch_get_main_queue(), ^
      [loadingView setHidden:YES];
      [self.table reloadData];
);

];

【讨论】:

谢谢,这样做了,但没有解决我的问题。 还是看不到加载视图和tableView?你能评论一下 [loadingView setHidden:YES];并告诉我加载视图是否可见? 您好,如果我评论该行,加载视图是可见的。但是未注释我看不到加载视图。我相信这与我的障碍有关。 我编辑了我的答案,似乎你的 xml 加载是异步的,所以在块中的代码完成之前,点击了 [loadingView setHidden:YES]; 行。 是的,xml 加载是异步的。我添加了您所说的内容,但是现在该应用程序卡在其启动图像上:(【参考方案2】:

像这样重构你的代码,我认为它应该可以工作

// Loop Through XML Data
[rxml iterate:@"channel" usingBlock:^(RXMLElement *supportElement) 
[supportElement iterate:@"item" usingBlock:^(RXMLElement *repElement) 
[loadingView setHidden:No];
...
...
...
...
...
...
[loadingView setHidden:YES];

];
];

【讨论】:

这样做不会显示 loadingView

以上是关于UITableView 重新加载时闪烁的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 没有在 reloadData 上重新加载

UITableview 与 UIRefreshcontroller 一起闪烁

重新加载和调用requestImageForAsset时UICollectionView闪烁

Laravel 5.3 - Vue 2 在页面重新加载时闪烁

React JS:图像大小在重新加载时闪烁,对象匹配:覆盖 CSS 属性

自定义 TableViewCells 在重新加载 tableview 时闪烁