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 在页面重新加载时闪烁