我正在创建一个允许用户在我的IOS应用程序中输入数据的表单。此表单允许用户输入大量重复数据。所以,有时候,这个过程需要时间,我想在这个过程中显示一个UIActivityIndicatorView。
不幸的是,旋转器在过程结束时只出现一秒或更短时间,而不是按预期开始。
有一些代码:
- (void) manageSpinner{
spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[spinner setCenter:CGPointMake(self.view.bounds.size.width/2.0, self.view.bounds.size.height/2.0)]; // I do this becau I'm in landscape mode
UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.tableView.bounds];
UIImage *image = [UIImage imageNamed:@"dark_gradiant.jpg"];
[imageView setImage:image];
[imageView addSubview:spinner];
[self.tableView addSubview:imageView];
[spinner startAnimating];
}
//On click save by the user
- (IBAction)save:(id)sender{
//Collect information from the form
myObject.name = nameTF.text;
[...]
if(informations OK[...]){
//Manage spinner
[self manageSpinner];
//Add : this is the long process
for (int i=0; i<nbRepeatChooseByUser; i++) {
[myObject register];
}
//Call the delegate that will dismiss the form
[self.delegate theSaveButtonOnTheAddMyObjectTVCWasTapped:self];
}
}
在添加方法之前调用微调器,但它似乎是在该过程之后设置的。
谢谢,
亚历山大
答案 0 :(得分:2)
活动指示器与您的长进程在同一个线程上运行,因此动画不会在您想要的时候立即启动。尝试在后台线程中运行您的长进程。
if(informations OK[...]){
//Manage spinner
[self manageSpinner];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Do your background process here
//Add : this is the long process
for (int i=0; i<nbRepeatChooseByUser; i++) {
[myObject register];
}
dispatch_async(dispatch_get_main_queue(), ^{
//This section will be called after your long process has been completed.
//Call the delegate that will dismiss the form
[self.delegate theSaveButtonOnTheAddMyObjectTVCWasTapped:self];
});
});
}
答案 1 :(得分:1)
这是因为TableView正在耗尽mainThread,同时你希望微调器执行。在这种情况下,编译器会对动作进行排队。因此,微调器动画突然发生..
要同步动作,请在背景线程中使微调器具有动画效果..
执行以下选项以启动和停止微调器
开始:[spinner performSelectorInBackground:@selector(startAnimating) withObject:self];
停止:[spinner performSelectorInBackground:@selector(stopAnimating) withObject:self];
答案 2 :(得分:0)
活动指示符被主线程中执行的操作阻止。 因此,将操作更改为背景线程,如:
dispatch_queue_t backgroundQueue;
backgroundQueue = dispatch_queue_create("registerqueue", NULL);
dispatch_async(backgroundQueue, ^(void) {
for (int i=0; i<nbRepeatChooseByUser; i++)
{
[myObject register];
}
});
不要忘记导入
#import <dispatch/dispatch.h>
答案 3 :(得分:0)
我找到了一个很好的MIT库来管理UISpinner:https://github.com/matej/MBProgressHUD