0

Facebook SDK for iOS を使用してアプリに Facebook ログインを追加しようとしています。

Facebook のサーバーへのリクエストには時間がかかる場合があるため、MBProgressHUD を使用することにしました。問題は、MBProgressHUD と FBRequest の両方がブロックを使用しているため、奇妙な動作が予想されることです。

これは私が使用したコードです:

MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithView:self.view];
[self.view addSubview:HUD];

HUD.delegate = self;
HUD.labelText = @"Loading";
HUD.minSize = CGSizeMake(135.f, 135.f);

[HUD showAnimated:YES whileExecutingBlock:^{

    [FBSession openActiveSessionWithReadPermissions:@[@"email"] allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

        if (error) {
            HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"error"]];
            HUD.mode = MBProgressHUDModeCustomView;
            HUD.detailsLabelText = error.localizedFailureReason;
            HUD.labelText = @"Error";

        }

        if (state == FBSessionStateClosedLoginFailed) {
            [FBSession.activeSession closeAndClearTokenInformation];
        }
        if (FBSession.activeSession.isOpen) {



            [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {

                if (!error) {
                 //Save User's Data


                    HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
                    HUD.mode = MBProgressHUDModeCustomView;
                    HUD.labelText = @"Logged in";

                } else {
                    HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"error"]];
                    HUD.mode = MBProgressHUDModeCustomView;
                    HUD.detailsLabelText = @"An error occurred, please retry later";
                    HUD.labelText = @"Error";
                }
            }];
        }

    }];
    sleep(2);
} completionBlock:^{

  //Return to previous page

}];

問題は、このメソッドに関連するボタンを押すと、進行状況の HUD が 1 秒未満しか表示されず、前のページに戻されることです。

私が見たいのは、すべてのプロセス中に表示される HUD です。

誰かがそれを行う方法を教えてもらえますか?

ありがとう

4

1 に答える 1

1

問題はshowAnimated:whileExecutingBlock:、ブロックが完了した直後に HUD を閉じることです。Facebook の認証方法は、バックグラウンドでコードを実行し、すぐに戻ります。代わりに、HUD だけを表示して、Facebook の完了ブロックで非表示にしてみてください。

-(void)yourMethodThatLogsIntoFacebook {
    MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithView:self.view];
    [self.view addSubview:HUD];

    HUD.delegate = self;
    HUD.labelText = @"Loading";
    HUD.minSize = CGSizeMake(135.f, 135.f);

    [HUD show:YES];

    [FBSession :@[@"email"] allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
        if (error) {
            [self updateHud:HUD withImage:@"error" text:@"Error" detailText:error.localizedFailureReason];
        }
        if (state == FBSessionStateClosedLoginFailed) {
            [FBSession.activeSession closeAndClearTokenInformation];
        }
        if (FBSession.activeSession.isOpen) {
            [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
                if (!error) {
                 //Save User's Data
                    [self updateHud:HUD withImage:@"37x-Checkmark.png" text:@"Logged in" detailText:nil];
                } else {
                    [self updateHud:HUD withImage:@"error" text:@"Error" detailText:@"An error occurred, please retry later"];
                }
            }];
        }
    }];
}

-(void)updateHud:(MBProgressHUD *)hud withImage:(NSString *)imageName text:(NSString *)text detailText:(NSString *)detailText {
    hud.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];
    hud.mode = MBProgressHUDModeCustomView;
    hud.labelText = text;
    hud.detailText = detailText;
    [hud hide:YES afterDelay:2.];
}
于 2013-06-15T00:44:40.517 に答える