2013-02-24 3 views
5

Я пишу код, чтобы получить доступ к учетной записи пользователя Twitter, но у меня возникли проблемы с обработкой случая, когда на устройстве нет учетных записей. То, что я хотел бы сделать, это показать предупреждение, сообщающее пользователю, что для аутентификации с помощью Twitter им сначала необходимо создать учетную запись в своих настройках.UIAlertView не работает в блоке обработчика завершения

Вот мой код:

self.accountStore = [[ACAccountStore alloc] init]; 
ACAccountType *accountTypeTwitter = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; 

[self.accountStore requestAccessToAccountsWithType:accountTypeTwitter options:nil completion:^(BOOL granted, NSError *error) { 
    if(granted) { 
     //Doesn't matter for the present case 
    } else if (error){ 

     [SVProgressHUD dismiss]; //not directly relevant to the present question, but it also doesn't work within the block, so I'm leaving it as a clue 

     switch ([error code]){ 
      case (6): 

       UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"No Twitter Account Detected" message:@"Please go into your device's settings menu to add your Twitter account." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
       [alert show]; //triggers an error 
       break; 

     } 
    } 
}]; 

Я не эксперт Xcode отладчик, но, видимо, ошибка происходит в потоке ACAccountStoreReply, около 25 звонков глубоко после [оповещений шоу] называется, в процесс называется ucol_getVersion. Состояние отладчика EXC_BAD_ACCESS (код = 2, адрес = 0xcc).

Я искал «Переполнение стека» и Интернет в целом, чтобы решения, касающиеся UIAlertViews, не работали в блоках, а также общие проблемы с отображением предупреждений (я пробовал разные значения для делегата), а также для общих проблем с вызывает запросAccessToAccountsWithType.

Я также попытался разобраться в своем понимании блоков, прочитав различные онлайн-ресурсы и соответствующие страницы программирования в Objective-C, 4-е дополнение.

Любая помощь приветствуется.

ответ

21

Вы должны всегда следить за тем, чтобы взаимодействие с пользовательским интерфейсом выполнялось в основном потоке. Оберните UIAlertView вызов в dispatch_async:

dispatch_async(dispatch_get_main_queue(), ^{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Twitter Account Detected" message:@"Please go into your device's settings menu to add your Twitter account." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
}); 

Вы также два nil сек в конце вызова.

+0

абсолютно правильный .. браво ... +1 –

+0

, но если я хочу вызвать метод делегирования этого предупреждения. ?? –

Смежные вопросы