iOS GUI刷新

iOS GUI刷新,ios,objective-c,user-interface,refresh,redraw,Ios,Objective C,User Interface,Refresh,Redraw,我在GUI上使用setNeedsDisplay,但有时无法完成更新。我使用的是UIPageControlView,每个页面都有UIScrollView,内部有UIView 我有以下管道: 1) 应用程序来自后台-称为applicationWillEnterForeground 2) 开始从服务器下载数据 2.1)数据下载完成后,触发选择器 3) 使用dispatch\u async和dispatch\u get\u main\u queue()用新数据填充标签、图像等 3.1)在查看时调用set

我在GUI上使用setNeedsDisplay,但有时无法完成更新。我使用的是
UIPageControlView
,每个页面都有
UIScrollView
,内部有
UIView

我有以下管道:

1) 应用程序来自后台-称为
applicationWillEnterForeground

2) 开始从服务器下载数据

2.1)数据下载完成后,触发选择器

3) 使用
dispatch\u async
dispatch\u get\u main\u queue()
用新数据填充标签、图像等

3.1)在查看时调用
setNeedsDisplay
(也可在滚动视图和页面控制器上尝试)

问题是,调用了步骤3.1,但只是不时地发生变化。如果我交换页面,刷新就完成了,我可以看到新的数据(这样下载就可以正常工作)。但是没有手动翻页,就没有更新

有什么帮助吗

编辑:步骤3和3.1中的代码(已删除\u needRefresh注释中指出的变量)

这里是数据下载后调用的选择器(在MainViewController中)

在AppDelegate中,我有一个应用程序来自后台:

-(void)applicationWillEnterForeground:(UIApplication *)application
{
    MainViewController *main = (MainViewController *)[(SWRevealViewController *)self.window.rootViewController frontViewController];


    [main UpdateData];
} 
在主视图控制器中

-(void)UpdateData
{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(FinishForecastDownload:) name:@"FinishDownload" object:nil]; //create selector

    [[DataManager SharedManager] DownloadForecastDataWithAfterSelector:@"FinishDownload"]; //trigger download
}

setNeedsDisplay
触发
drawRect:
并用于“重新绘制视图的像素”,而不是配置视图或其子视图

您可以覆盖
drawRect:
并修改标签等。但这不是它的目的,而且
setNeedsLayout
/
布局子视图
也不是

您应该创建自己的
updateUI
方法,在该方法中,您可以使用新数据更新UI,而不依赖专门的系统调用来重画像素(
setNeedsDisplay
)或调整子视图的帧(
drawRect:


您应该在
updateUI
方法中设置所有
label.text
imageView.image
等。另外,最好仅通过此方法设置这些值,而不要直接从任何方法设置这些值。

尝试以下方法:

[self.view performSelectorOnMainThread:@selector(setNeedsLayout) withObject:nil waitUntilDone:NO];
或查看此链接:


所有建议的解决方案都不起作用。最后,我将当前显示的屏幕从
UIPageControlView
中删除,然后再次添加此屏幕。有点像通过编程在那里来回更改页面


它有点慢,但工作正常。

是否在dispatch\u async块中调用setNeedsDisplay?如果是这样的话:需要在主线程上调用setNeedsDisplay@SebastianBorggrewe我在dispatch_async中与dispatch_get_main_queue()调用他,你能发布dispatch块的代码吗?@SebastianBorggrewe添加代码snipsetOk只是为了澄清。您已确保[self.contentView setNeedsDisplay];和[self.pageControl setNeedsDisplay];实际上被称为(断点或NSLog),并且两者(如果您使用故事板和/或nib文件)都是链接的输出我应该在我自己的更新中放什么?我已经自己更改了所有标签,但唯一缺少的是那些新的可见值。我仍然看到旧的。
-(void)UpdateData
{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(FinishForecastDownload:) name:@"FinishDownload" object:nil]; //create selector

    [[DataManager SharedManager] DownloadForecastDataWithAfterSelector:@"FinishDownload"]; //trigger download
}
[self.view performSelectorOnMainThread:@selector(setNeedsLayout) withObject:nil waitUntilDone:NO];