【发布时间】:2015-03-09 07:02:57
【问题描述】:
我有两个视图控制器;在第二个视图中,处理了一堆数据,这需要相当长的时间,而在第一个视图中,有一个导航到第二个视图的按钮。我想在单击按钮后立即在第二个视图中显示进程的活动指示器。但是在第二个视图中初始化 UIActivityIndicatorView 似乎不起作用。单击按钮时没有显示任何内容,并且在处理数据时应用程序卡在第一个视图中。
下面是我在第二个视图控制器中viewDidLoad写的代码。
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[_activityIndicator setCenter:CGPointMake(SCREEN_WIDTH/2, SCREEN_HEIGHT/2)];
[self.view addSubview:_activityIndicator];
...............
[_activityIndicator startAnimating];
...............
// data processing
[_activityIndicator stopAnimating];
有人知道怎么解决吗?
========编辑=========
非常感谢您的建议。现在我尝试使用NSThread,但微调器出现得很晚。这是我在第一个视图控制器中编写的代码。
- (void)viewDidLoad
{
[super viewDidLoad];
// activity indicator
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[_activityIndicator setCenter:CGPointMake(SCREEN_WIDTH/4, SCREEN_HEIGHT/4)];
[self.view addSubview:_activityIndicator];
}
- (IBAction)startButtonClicked:(id)sender
{
[NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
}
-(void)threadStartAnimating:(id)data
{
NSLog(@"start");
[_activityIndicator startAnimating];
[self performSelectorOnMainThread:@selector(threadStopAnimating:) withObject:nil waitUntilDone:YES];
}
-(void)threadStopAnimating:(id)data
{
NSLog(@"stop");
[_activityIndicator stopAnimating];
}
微调器在NSLog(@"start"); 被执行后大约 2 秒出现,并在很短的时间内出现。我将- (IBAction)startButtonClicked:(id)sender 与导航到第二个视图的按钮相关联。
有没有更好的方法来输入[_activityIndicator startAnimating];?
【问题讨论】:
-
在 secondview 中启动新线程以便 uiactivityindicator 开始加载,因为我认为在主线程中您的数据正在加载。使用 [NSThread detachNewThreadSelector:@selector(showIndicator) toTarget:self withObject:nil];或者使用 Dispatch_async 方法。
-
您在
viewDidLoad中的代码看起来没问题...也许问题出在第一个视图中,您可以在那里显示一些代码吗? -
"点击按钮没有任何显示,处理数据时应用卡在第一个视图。" “被卡住”到底是什么意思?
-
@nburk 在第一个视图中我没有编写任何代码,但现在我尝试使用
NSThread。我在编辑部分写了一些代码。我的意思是单击按钮后,它会在第一个视图中停留片刻,而数据正在第二个视图中加载。对不起我的英语。
标签: ios objective-c uiactivityindicatorview