2011-11-08 44 views
0

所以我使用的子视图包含一个标签,活动指示灯和的UIImageView。我有它在一个子视图,我默认时加载我隐藏它弹出子视图。然而,子视图并没有隐藏自己,直到我完成后我需要完成的意义它显示了约0.01秒,而不是我想要的时间设置隐藏属性不会立即生效

我试过做这样的事情。

do{ 
    loadingSubview.hidden=false; 
    }while(loadingSubview.hidden); 

要确定属性是在继续之前设置,但它会产生相同的结果是否有我做错了什么?

回答

1

你需要退出当前的方法(S)回运行循环任何UI更新发生。在

动做其他的东西这个UI更新后,以后在其他的NSTimer任务或其他动作延迟(只是一对夫妇几十毫秒都行)。不要在方法中等待。

1

注意,对于大多数绘图效果,绘制不会实时发生。大多数情况下,你告诉iOS要绘制什么,并在你的方法失效之后在主事件循环中绘制它。所以你不能通过调试器看着它隐藏在视图中的东西。

如果你想要的东西延迟反应,使用的一个:

[self performSelector:@selector(mydelayedtask) withObject:nil afterDelay:1.0f]; 

,这将给你一个1秒的延迟。

+0

我不想要一个延迟的反应就是这个问题,当我需要的时候它不会加载我的子视图 – endy

+0

当你需要它显示时,你忘了立即退出到运行循环。 – hotpaw2

2

贵“的问题”的根本原因是,你阻止事件循环无法处理其事件。绘图就是其中之一。另外一个是用户互动活动等,如果你真的想立即取消隐藏按钮,你可以这样做:

loadingSubview.hidden = NO; // why "false"??? :) 
[self performSelector:@selector(timeConsumingStuff) 
      withObject:nil 
      afterDelay:0]; // 0 is good here == "when idle" 

你可以肯定你的按钮,但它不会响应(以及其他)直到耗时完成。

另一个解决方案是明确的进程中运行循环的事件。 (看看[NSRunLoop runMode:beforeDate:]。但是......除非你把耗时的东西移到另一个线程上,否则将会有一个惩罚