我有一个tableview,用于显示从Web服务加载的数据。有时它会加载很快,有时需要一段时间。在加载时,tableview只显示一个空白屏幕(在我的例子中是灰色屏幕)。我想在tableview背景视图中显示一个简单的图像,说明加载并有一个加载图标,我将动画旋转,但我不能让它显示出来。这是我的代码:
UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, self.view.bounds.size.height)];
[backgroundView setBackgroundColor:[UIColor colorWithRed:227.0 / 255.0 green:227.0 / 255.0 blue:227.0 / 255.0 alpha:1.0]];
self.tableLoading.image = [UIImage imageNamed:@"loading.png"];
self.tableLoading.frame = CGRectMake(145, 80, 30, 30);
[backgroundView addSubview:self.tableLoading];
[self.feedTableView setBackgroundView:backgroundView];
背景视图按预期显示,因此显示灰色背景,但我无法显示图像。
有什么建议吗?这似乎是一个简单的问题,但我已经花了很长时间才没有成功。提前致谢!
答案 0 :(得分:0)
您是如何进行网络服务的?我想它是在异步块上完成的。也许AFNetworking
NSOperation
之类的内容会阻止?如果是这样,您将图像设置为背景?所有用户界面(UI)的东西不应该在后台线程上完成,它应该在主线程上完成,因为主线程是唯一应该参与UI的人。
尝试以下方法:
dispatch_async(dispatch_get_main_queue(), ^{
UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, self.view.bounds.size.height)];
[backgroundView setBackgroundColor:[UIColor colorWithRed:227.0 / 255.0 green:227.0 / 255.0 blue:227.0 / 255.0 alpha:1.0]];
self.tableLoading.image = [UIImage imageNamed:@"loading.png"];
self.tableLoading.frame = CGRectMake(145, 80, 30, 30);
[backgroundView addSubview:self.tableLoading];
[self.feedTableView setBackgroundView:backgroundView];
});
您可以在启动请求时开始显示UITableView
背景图片,并在请求完成网络后立即将其解除。
例如,SLRequest
有一个名为performRequestWithHandler:
的发送请求方法,它有一个在请求完成时要调用的处理程序,在该处理程序中,您可以关闭自定义指标或从您的指针中删除它查看控制器。
希望得到这个帮助。
答案 1 :(得分:0)
您可以避免使用UIView,而是可以使用活动指示器。 尝试这样的事情:
-(void)viewDidLoad{
UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, self.view.bounds.size.height)];
backgroundView.tag=1;
[backgroundView setBackgroundColor:[UIColor colorWithRed:227.0 / 255.0 green:227.0 / 255.0 blue:227.0 / 255.0 alpha:1.0]];
self.tableLoading.image = [UIImage imageNamed:@"loading.png"];
self.tableLoading.frame = CGRectMake(145, 80, 30, 30);
[backgroundView addSubview:self.tableLoading];
[self.view addSubview:backgroundView];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do your web service call asynchronous
dispatch_sync(dispatch_get_main_queue(), ^{
//All UI needs to be here, in this thread
// remove from superview your loading image to show your tableview content
for (UIView *subview in [self.view subviews]) {
if (subview.tag == 1) {
[subview removeFromSuperview];
}
}
[self.yourTableView reloadData];
});
});
}