0

アプリがユーザー認証をチェックしている間、右の UIBarButtonItem の代わりにアクティビティ インジケーターを表示したいと思います。

現在何が起こっているかというと、ユーザーがログイン ボタンをクリックすると、UI が一時停止し、Web 呼び出しが戻るのを待ちます。ディスパッチ キューを使用してこれを別のスレッドで実行することをお勧めしますが、これら 2 つのコードを組み合わせる方法がわかりません。

ディスパッチ キュー:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^ {
//show your indicator button
dispatch_async(dispatch_get_main_queue(), ^ {
    //stop indicator when user has logged in
});
});

ログイン方法:

- (void) loginAction{

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] 
initWithFrame:CGRectMake(0, 0, 20, 20)];
[activityIndicator startAnimating];
UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] 
initWithCustomView:activityIndicator];
self.navigationItem.rightBarButtonItem = activityItem;

if ([userNameTextField.text isEqualToString:@""] || [passwordTextField.text 
isEqualToString:@""]) {

UIBarButtonItem *btnGo = [[UIBarButtonItem alloc] initWithTitle:@"Login" 
style:UIBarButtonItemStyleBordered target:self action:@selector(loginAction)];
self.navigationItem.rightBarButtonItem = btnGo;
[self.navigationItem.rightBarButtonItem setTintColor:[UIColor colorWithRed:44.0/255.0 
green:160.0/255.0 blue:65.0/255.0 alpha:1.0]];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Invalid Login" message:@"" 
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
    return;
}

if (loginSuccess== true) {

    //continue
}

}else
{
UIBarButtonItem *btnGo = [[UIBarButtonItem alloc] initWithTitle:@"Login" 
style:UIBarButtonItemStyleBordered target:self action:@selector(loginAction)];
self.navigationItem.rightBarButtonItem = btnGo;
[self.navigationItem.rightBarButtonItem setTintColor:[UIColor colorWithRed:44.0/255.0 
green:160.0/255.0 blue:65.0/255.0 alpha:1.0]];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Invalid Login" message:@"" 
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
return;

}
}
4

3 に答える 3

2

私はこの同じ問題に直面しました。私はこのように修正しました。viewdidload で、アクティビティ インジケーターをサブ ビューとして追加し、ログイン ボタンをクリックしながらインジケーターのアニメーション化を開始しました。次に、performSelector を使用して、ログイン サービス呼び出しを含むメソッドを呼び出しました。最後に、インジケーターを停止します。私にとってはうまくいきます。このコードを使用してください..

.h UIActivityIndi​​catorView *activityIndi​​cator;

.m

- (void)viewDidLoad
{

    [super viewDidLoad];

    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    [activityIndicator setFrame:CGRectMake(0, 0, 37, 37)];
    [activityIndicator setCenter:self.view.center];
    [activityIndicator setHidesWhenStopped:YES];
    [self.view addSubview:activityIndicator];
    [self setDisplayStatusOfControls];

}


  -(IBAction)loginButton
  {

     [activityIndicator startAnimating];
     [self performSelector:@selector(Loginauthentication) withObject:nil afterDelay:0.1f];

  }

- (void) loginAction
{
//Log in authentication..



[activityIndicator stopAnimating];
}
于 2013-03-07T10:01:53.347 に答える
1

次のようにします。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^ {
    //show your indicator button
    dispatch_async(dispatch_get_main_queue(), ^ {
        //stop indicator when user has logged in
    });
});
于 2013-03-07T08:51:02.173 に答える
0

UIはメインスレッドでのみ更新できます。メインスレッドが何か他のことをしているとき、UIは更新できません。アクティビティインジケーターを更新するには、次のようにします。

[self performSelectorOnMainThread:@selector(loginAction:) withObject:anObject waitUntilDone:NO];
于 2013-03-07T09:07:00.050 に答える