如何创建可在任何给定时间重复使用的加载屏幕。我知道Default.png但我需要灵活地在应用程序生命周期的任何时候插入加载屏幕。
这就是我到目前为止所做的。
//inside a method that gets called by a UIButton
LoadingViewController* loadController = [[LoadingViewController alloc] initWithNibName:@"Loading" bundle:nil vertical:NO];
[self.view addSubview: loadController.view];
//some method call that takes a few seconds to execute
[self doSomething];
//This loads some other view, my final view
[self.view addSubview: someOtherView]
但似乎永远不会显示加载视图。相反,之前的视图会保留,直到添加“someOtherView”。我把跟踪日志和代码似乎确实执行了,我甚至用sleep(2)替换了[self doSomething],但是从不显示中间加载视图。
如果我删除[self.view addSubview:someOtherView];然后几秒钟后......(在doSomething完成执行之后)显示加载视图,因为没有被推到它上面的视图,但这显然不是我想要的功能。
可以解释一下这种行为吗?有什么关于渲染周期我误解,因为它看起来不像(至少在屏幕上)视图立即更新,即使我调用[self.view addSubview:loadController.view];
我需要创建一个单独的线程吗?
答案 0 :(得分:4)
通常,要使UI的更改对用户可见,控件必须返回到主runLoop。在将加载视图下移并将其替换为其他视图后,您只返回runLoop。处理此问题的一种策略是将执行加载的代码移动到另一个线程上。 NSOperation和NSOperationQueue可以用于此目的。
更简单的方法是使用performSelectorInBackground:withObject来进行处理。处理完成后,可以再次更新UI以显示数据。重要的是要记住UI更新必须在主线程上执行。使用performSelectorOnMainThread:withObject:waitUntilDone:从加载线程完成此操作。
这听起来很复杂,但它真的很简单,就像将单个方法分解为三个不同的方法一样简单:
答案 1 :(得分:1)
我创建了一个UIView的子类,我初始化了我的加载视图应该如何工作和看起来像。 (我的视图出现并从底部滑入一个漂亮的动画)。
然后我添加了代码来处理UIViewController的子类中是否应该加载视图。
然后我让所有的viewcontrollers都成为我的新viewcontroller类的子类,这使我可以这样做:
[self showloadingMessage:@"loading..."];
在我的所有viewcontrollers中......