iOS :在加载第二个视图控制器时使用 activity 指示器
iOS : using activity indicator in loading for second view controller
我有两个视图控制器;在第二个视图中,处理大量数据需要花费大量时间,而在第一个视图中,有一个导航到第二个视图的按钮。我想在单击按钮后立即在第二个视图中显示进程的 activity 指示符。但是在第二个视图中初始化 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];
?
也许您可以尝试使用 Grand Central Dispatch(线程)解决此问题。
第二个 VC,试试这个代码:
- (void) viewDidLoad{
[super viewDidLoad];
// Main thread
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[_activityIndicator setCenter:CGPointMake(SCREEN_WIDTH/4, SCREEN_HEIGHT/4)];
[self.view addSubview:_activityIndicator];
[_activityIndicator startAnimating];
// create a queue
dispatch_queue_t queue = dispatch_queue_create("data_process", 0);
// send a block to the queue - Not in Main thread
dispatch_async(queue, ^{
// data processing
.................
// Interaction with User Interface - Main thread
dispatch_async(dispatch_get_main_queue(), ^{
[_activityIndicator stopAnimating];
_activityIndicator.hidden = YES;
});
});
}
希望对您有所帮助。
我有两个视图控制器;在第二个视图中,处理大量数据需要花费大量时间,而在第一个视图中,有一个导航到第二个视图的按钮。我想在单击按钮后立即在第二个视图中显示进程的 activity 指示符。但是在第二个视图中初始化 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];
?
也许您可以尝试使用 Grand Central Dispatch(线程)解决此问题。
第二个 VC,试试这个代码:
- (void) viewDidLoad{
[super viewDidLoad];
// Main thread
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[_activityIndicator setCenter:CGPointMake(SCREEN_WIDTH/4, SCREEN_HEIGHT/4)];
[self.view addSubview:_activityIndicator];
[_activityIndicator startAnimating];
// create a queue
dispatch_queue_t queue = dispatch_queue_create("data_process", 0);
// send a block to the queue - Not in Main thread
dispatch_async(queue, ^{
// data processing
.................
// Interaction with User Interface - Main thread
dispatch_async(dispatch_get_main_queue(), ^{
[_activityIndicator stopAnimating];
_activityIndicator.hidden = YES;
});
});
}
希望对您有所帮助。