我正在尝试在我的应用程序中添加一个«loader-view»,它会在做东西时显示一个微调器。
第一次运行正常,但第二次无效。
这就是我的所作所为:
我有一个用于微调器的viewController(spinnerViewController)和一个我在IB中创建的nib文件(spinner.xib)。
我在viewDidLoad-event中加载nib:
spinnerView = [[spinnerViewController alloc] initWithNibName:@"spinner" bundle:nil];
[spinnerView retain];
spinnerView在.h文件中声明(spinnerViewController * spinnerView;)
接下来,我展示了微调视图:
[self.view addSubview:spinnerView.view];
[self.view bringSubviewToFront:spinnerView.view];
工作得很好......
现在麻烦开始了。无论我做什么,我都无法再显示微调视图。
我试图隐藏它(self.view sendSubViewToBack:spinnerView.view),它可以隐藏,但是当我尝试将它再次带到前面时(self.view bringSubViewToFront:spinnerView.view)它不起作用。
我也尝试删除微调器视图并再次添加但没有成功(在spinnerViewController中:[self.view removeFromSuperview]并再次显示它[self.view addSubview ...)
[编辑]
我稍微更改了整个设置,只是将微调器视图设为IB中的子视图 - 再次隐藏了作品,但再次显示失败。 我发现了:在bringSubViewToFront命令之后,我调用了一些web服务来获取一些数据。当我评论以下代码并只显示spinnerView时,它可以工作。所以现在我想弄清楚如何确定spinner视图何时出现然后继续代码 - 但自然,这不起作用(还):)
任何想法我做错了什么? ;)
答案 0 :(得分:1)
问题解决了。
此页面给出了答案:http://urenjoy.blogspot.com/2009/05/uiactivityindicatorview.html
显然,更新必须在一个单独的线程中进行,因为web-stuff会阻止当前的更新,因此视图没有出现。
[NSThread detachNewThreadSelector:@selector(doWork) toTarget:self withObject:nil];
- (void) doWork {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
.....Time Consuming Code here .....
[pool release];
}
答案 1 :(得分:0)
我可能不完全是你的问题,但一般来说创建一个ViewController类是为了在屏幕上显示一个微调器是一个巨大的矫枉过正......试着发现你所做的背后的逻辑:你创建一个viewcontroller ,但你永远不会使用它,你使用视图。
所以总之我相信你只需要一个UIView(UIViewController的view属性) 你为什么不尝试这样的事情:
... in your class interface...
UIActivityIndicator* activity;
... when the activity needs to happen ...
activity = [[UIActivityIndicator alloc] initWithActivityIndicatorStyle: ....
[activity startAnimating];
[self.view addSubview:activity];
[activity release]
... when the activity is finished
[activity removeFromSuperview]; //this will also decrease the retain count