1

写真を撮った後に表示される Instagram の共有ページのように、Twitter への共有を示すトグル ボタンを作成しようとしています。具体的には、状態で開始するのは UIButton でありNormal、それを押すSelectedと、ユーザーの Twitter ハンドルをタイトルとして持つ状態になります。

最初のタップで、保存されている Twitter アカウントの ACAccountStore をチェックします。問題は、関数内の ACAccountStoreRequestAccessCompletionHandler の遅延requestAccessToAccountsWithTypeです。ハンドラーで、Twitter ハンドルをセットアップし、ボタンを選択するように変更します。ただし、ボタンが選択された状態を視覚的に変更するには、長い時間がかかります。これは、呼び出し後に NSLog によって検証されたように、選択された状態にあるにもかかわらずです。

この遅延の原因がわかりません。これは、ボタンを処理するコードです。

- (IBAction)pressedTwitter:(id)sender {
    UIButton *button = (UIButton*)sender;
    if (button.selected) {
        button.selected = !button.selected;
    } else {
        if (self.twitterAccount != nil) {
            button.selected = !button.selected;
        } else {
            [self getTwitterAccount:button];
        }
    }
}


- (void)getTwitterAccount:(UIButton*)button
{
    // Get Account
    ACAccountStore *store = [[ACAccountStore alloc] init];
    ACAccountType *twitterAccountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    //  Request permission from the user to access the available Twitter accounts
    [store requestAccessToAccountsWithType:twitterAccountType options:nil completion:^(BOOL granted, NSError *error) {
        if (granted) {
            NSArray *twitterAccounts = [store accountsWithAccountType:twitterAccountType];

            if ([twitterAccounts count] > 0) {
                self.twitterAccount = [twitterAccounts objectAtIndex:0];
                [self.twitterButton setTitle:self.twitterAccount.username forState:UIControlStateSelected];


                [self setTwitterButtonNormalText:YES];
                self.twitterButton.selected = YES;
                NSLog(@"Twitter Button Selected");

                self.statusLabel.text = @"Twitter Account Found";
            } else {
                [self setTwitterButtonNormalText:NO];
                button.selected = NO;

                NSLog(@"Not enough Twitter Accounts");
            }
        } else {
            NSLog(@"Twitter Account Permission Not Granted");

            [self setTwitterButtonNormalText:NO];
            button.selected = NO;

        }
    }];
}

- (void)setTwitterButtonNormalText:(BOOL)accountAvailable
{
    if (accountAvailable) {
        [self.twitterButton setTitle:@"Twitter" forState:UIControlStateNormal];
        [self.twitterButton setTitleColor:[UIColor colorWithWhite:0.5 alpha:1.0] forState:UIControlStateNormal];
    } else {
        [self.twitterButton setTitle:@"No Twitter" forState:UIControlStateNormal];
        [self.twitterButton setTitleColor:[UIColor colorWithRed:125./255. green:21./255. blue:0 alpha:1] forState:UIControlStateNormal];
    }
}

ご協力いただきありがとうございます。

4

1 に答える 1

2

同様の問題を解決しました。これは、requestAccessToAccountsWithType 完了関数が別のスレッドにあり、インターフェイスと対話する場合はメイン スレッドに戻る必要があるためです。

メインスレッドに戻ることができます:

dispatch_sync(dispatch_get_main_queue(), ^{
    // code that change the ui, perfom segues, ...
});

これを試して:

- (void)getTwitterAccount:(UIButton*)button
{
    // Get Account
    ACAccountStore *store = [[ACAccountStore alloc] init];
    ACAccountType *twitterAccountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    //  Request permission from the user to access the available Twitter accounts
    [store requestAccessToAccountsWithType:twitterAccountType options:nil completion:^(BOOL granted, NSError *error) {
        if (granted) {
            NSArray *twitterAccounts = [store accountsWithAccountType:twitterAccountType];

            if ([twitterAccounts count] > 0) {
                self.twitterAccount = [twitterAccounts objectAtIndex:0];
                // go back to the main thread
                dispatch_sync(dispatch_get_main_queue(), ^{
                    [self.twitterButton setTitle:self.twitterAccount.username forState:UIControlStateSelected];
                    [self setTwitterButtonNormalText:YES];
                    self.twitterButton.selected = YES;
                });
                NSLog(@"Twitter Button Selected");

                self.statusLabel.text = @"Twitter Account Found";
            } else {
                // go back to the main thread
                dispatch_sync(dispatch_get_main_queue(), ^{
                    [self setTwitterButtonNormalText:NO];
                    button.selected = NO;
                });
                NSLog(@"Not enough Twitter Accounts");
            }
        } else {
            NSLog(@"Twitter Account Permission Not Granted");
            // go back to the main thread
            dispatch_sync(dispatch_get_main_queue(), ^{
                [self setTwitterButtonNormalText:NO];
                button.selected = NO;
            });
        }
    }];
}
于 2013-02-20T00:38:29.943 に答える