2014-12-29 10 views
6

Ho questo codice seduto in un'UIViewController (XCode 6.1, iOS 8.1.1):Come risolvere l'errore di runtime utilizzando UIAlertController

[UIAlertController showActionSheetInViewController:self 
         withTitle:@"Test Action Sheet" 
         message:NSLocalizedString(@"Are you sure you want to delete ALL appointments?",nil) 
         cancelButtonTitle:@"Cancel" 
         destructiveButtonTitle:@"Yes" 
         otherButtonTitles:@[@"No"] // same as Cancel 
         tapBlock:^(UIAlertController *controller, UIAlertAction *action, NSInteger buttonIndex){ 
           if (buttonIndex == UIAlertControllerBlocksCancelButtonIndex) { 
           NSLog(@"Cancel Tapped"); 
          } else if (buttonIndex == UIAlertControllerBlocksDestructiveButtonIndex) { 
           NSLog(@"Delete Tapped"); 
          } else if (buttonIndex >= UIAlertControllerBlocksFirstOtherButtonIndex) { 
           NSLog(@"Other Action Index %ld", (long)buttonIndex - UIAlertControllerBlocksFirstOtherButtonIndex); 
          } 
         }]; 

quando l'eseguo, ottengo questo errore di run-time:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController (<UIAlertController: 0x7fdfe3324f00>) of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'

Cosa devo fare per farlo funzionare? (Ho guardato SO e Google e non ho trovato nulla di specifico). Apprezzo tutto l'aiuto che posso ottenere su questo ...

UPDATE ho riscritto senza il codice di terze parti; ha aggiunto questo codice e ora funziona!

UIAlertController * view= [UIAlertController 
          alertControllerWithTitle:@"My Title" 
          message:@"Select your Choice" 
          preferredStyle:UIAlertControllerStyleActionSheet]; 

UIAlertAction* ok = [UIAlertAction 
        actionWithTitle:@"OK" 
        style:UIAlertActionStyleDefault 
        handler:^(UIAlertAction * action) 
        { 
         //Do some thing here 
         [view dismissViewControllerAnimated:YES completion:nil]; 

        }]; 
UIAlertAction* cancel = [UIAlertAction 
         actionWithTitle:@"Cancel" 
         style:UIAlertActionStyleDefault 
         handler:^(UIAlertAction * action) 
         { 
          [view dismissViewControllerAnimated:YES completion:nil]; 

         }]; 


[view addAction:ok]; 
[view addAction:cancel]; 

view.popoverPresentationController.sourceView = self.view; 
view.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width/2.0, self.view.bounds.size.height/2.0, 1.0, 1.0); 
[self presentViewController: view animated:YES completion:nil]; 

risposta

1

C'è ben poco le informazioni per andare avanti qui ...

Sembra che si sta utilizzando https://github.com/ryanmaxwell/UIAlertController-Blocks, non lo standard UIAlertController, nel qual caso l'eccezione suggerisce cambiamenti che la versione del codice che' l'uso non è ancora completo o un caso d'uso che richiede un lavoro extra da parte tua.

Non ho mai usato questo codice di terze parti, ma un controllo rapido non mostra alcun ovvio "fai questo" nei documenti. La mia raccomandazione iniziale sarebbe quella di implementare il metodo delegate sulla vista in questione e dargli quello che vuole: la posizione in cui presentare il popover.

+0

Ho aggiornato la domanda con il codice corretto. Grazie per il tuo aiuto, Brad! Lo apprezzo. – SpokaneDude

7

Il messaggio di errore che hai ricevuto è apparso perché hai eseguito il codice iPhone su un iPad. Per l'utilizzo su un iPad, è necessario impostare popoverPresentationController di alertController. Il rettangolo di origine può essere generato anche senza i calcoli della dimensione sciatta. Di seguito, è un metodo completo, che mostra come si incontrerebbe il codice premendo un pulsante. Dopo aver configurato AlertController nel modo desiderato, si ottiene il suo popoverPresentationController e configurato per l'utilizzo con l'iPad. Nel metodo seguente, il pulsante che è stato premuto è il mittente. Quindi restituiamo il mittente a quel pulsante, quindi usiamo il pulsante per impostare il rettangolo. Non è necessario calcolare le dimensioni disordinate. Ora, se si esegue il codice sull'iPad, il popover non visualizzerà il pulsante Annulla (che appare sull'iPhone). Questo è di design. Se si visualizza la documentazione Apple UIPopoverController, si vede che il popover viene annullato toccando al di fuori di esso.

- (IBAction)showImagePickerButtonTapped:(id)sender; 
{ 
    BOOL isCameraAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 
    BOOL isPhotoLibraryAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]; 

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; 

    [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; 

    if (isCameraAvailable) { 
     [alertController addAction:[UIAlertAction actionWithTitle:@"Camera" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
      [self _showImagePickerWithSourceType:UIImagePickerControllerSourceTypeCamera]; 
     }]]; 
    } 

    if (isPhotoLibraryAvailable) { 
     [alertController addAction:[UIAlertAction actionWithTitle:@"Photo Library" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
      [self _showImagePickerWithSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; 
     }]]; 
    } 

    // The following lines are needed for use with the iPad. 
    UIPopoverPresentationController *alertPopoverPresentationController = alertController.popoverPresentationController; 
    UIButton *imagePickerButton = (UIButton*)sender; 
    alertPopoverPresentationController.sourceRect = imagePickerButton.frame; 
    alertPopoverPresentationController.sourceView = self.view; 

    [self showDetailViewController:alertController sender:sender]; 
} 
Problemi correlati