2013-02-24 15 views
5

Sto scrivendo il codice per accedere a un account Twitter degli utenti, ma sto riscontrando problemi nella gestione del caso in cui nessun account è presente sul dispositivo. Quello che mi piacerebbe fare è visualizzare un avviso che informa l'utente che, al fine di autenticarsi con Twitter, dovrà prima creare l'account nelle sue impostazioni.UIAlertView non funziona nel blocco handler di completamento

Ecco il mio codice:

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; 

     } 
    } 
}]; 

Non sono un esperto con il debugger Xcode, ma a quanto pare l'errore si verifica nel thread ACAccountStoreReply, circa 25 chiamate profonda dopo [avviso spettacolo] è chiamato, in un processo chiamato ucol_getVersion. Il debugger dichiara EXC_BAD_ACCESS (codice = 2, indirizzo = 0xcc).

Ho cercato su Stack Overflow e su Internet in generale per soluzioni relative a UIAlertViews che non funzionano in blocchi, e anche per problemi generali che mostrano avvisi (ho provato diversi valori per il delegato), e anche per problemi generali con chiama a requestAccessToAccountsWithType.

Ho anche tentato di rispolverare la mia comprensione dei blocchi leggendo varie risorse online e le pagine pertinenti di Programmazione in Objective-C, 4a aggiunta.

Qualsiasi aiuto è apprezzato.

risposta

21

È sempre necessario assicurarsi che l'interazione dell'interfaccia utente venga eseguita sul thread principale. Avvolgete il vostro UIAlertView chiamata in un 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]; 
}); 

È inoltre aveva due nil s al termine della chiamata.

+0

assolutamente corretto .. bravo ... +1 –

+0

ma se voglio chiamare il metodo delegato di questa alertview. ?? –

Problemi correlati