1

我正在制作一个允许用户在我的 IOS 应用程序中输入数据的表单。该表格允许用户输入大量重复数据。所以,有时,这个过程需要时间,我想在这个过程中显示一个 UIActivityIndi​​catorView。

不幸的是,微调器在过程结束时只出现一秒或更短,而不是像预期的那样在开始时出现。

有一些代码:

- (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];
    }
}

在添加方法之前调用微调器,但它似乎是在该过程之后设置的。

谢谢,

亚历山大

4

4 回答 4

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];
        });

    });

}
于 2012-11-09T11:07:32.313 回答
1

发生这种情况是因为 TableView 正在用完 mainThread,同时您希望微调器执行。在这种情况下,编译器会将操作排队。因此微调器动画会突然发生..

要同步动作,使微调器在后台线程中动画..

执行以下选项来启动和停止微调器

开始: [spinner performSelectorInBackground:@selector(startAnimating) withObject:self]; 停止: [spinner performSelectorInBackground:@selector(stopAnimating) withObject:self];

于 2012-11-09T11:06:02.277 回答
0

Activity 指示器被在主线程中执行的操作阻塞。因此,将操作更改为后台线程,例如:

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>
于 2012-11-09T11:09:40.037 回答
0

我找到了一个很好的 MIT 库来管理 UISpinner:https ://github.com/matej/MBProgressHUD

于 2012-11-27T09:25:35.577 回答