2014-12-29 11 views
6

Ich habe diesen Code in einem UIViewController sitzen (XCode 6.1, iOS 8.1.1):Wie beheben Laufzeitfehler mit 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); 
          } 
         }]; 

Wenn ich es laufen, bekomme ich diese Laufzeitfehler:

*** 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.'

Was muss ich tun, damit dies funktioniert? (Ich habe SO und Google angeschaut und nichts Spezifisches gefunden). Ich schätze jede mögliche Hilfe, die ich auf diesem ... erhalten kann

AKTUALISIEREN Ich schrieb es ohne den 3rd-Partycode neu; diesen Code hinzugefügt, und jetzt funktioniert es!

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]; 

Antwort

1

Es gibt sehr wenig Informationen hier zu gehen ...

Es Sie https://github.com/ryanmaxwell/UIAlertController-Blocks verwenden erscheint, nicht die Standard-UIAlertController, wobei in diesem Fall die Ausnahme Änderungen schlägt vor, dass die Version des Codes Sie‘ Wiederverwendung deckt noch nicht oder ein Anwendungsfall, der zusätzliche Arbeit von Ihnen erfordert.

Ich habe noch nie diesen 3rd-Party-Code verwendet, aber eine schnelle Überprüfung zeigt keine offensichtliche "do this" in den Dokumenten. Meine erste Empfehlung wäre, die Delegate-Methode in der fraglichen Ansicht zu implementieren und ihr zu geben, was sie will - den Ort, an dem das Popover präsentiert werden soll.

+0

Ich aktualisierte die Frage mit dem korrigierten Code. Danke für deine Hilfe, Brad! Ich schätze es. – SpokaneDude

7

Die Fehlermeldung, die Sie erhalten haben, erschien, weil Sie den iPhone-Code auf einem iPad ausgeführt haben. Zur Verwendung auf einem iPad müssen Sie den popoverPresentationController des alertControllers einstellen. Das Quellrechteck kann auch ohne schlampige Dimensionsberechnungen erzeugt werden. Im Folgenden finden Sie eine vollständige Methode, die zeigt, wie Sie den Code beim Drücken einer Schaltfläche erhalten würden. Nachdem Sie den AlertController wie gewünscht eingerichtet haben, erhalten Sie seinen popoverPresentationController und richten ihn für die Verwendung mit dem iPad ein. In der folgenden Methode ist die Schaltfläche, die gedrückt wurde, der Absender. Wir werfen also den Absender auf diese Schaltfläche zurück und verwenden dann die Schaltfläche, um das Rechteck festzulegen. Keine unordentlichen Dimensionen müssen berechnet werden. Wenn Sie nun den Code auf dem iPad ausführen, zeigt das Popover die Schaltfläche Abbrechen nicht an (die auf dem iPhone angezeigt wird). Das ist Absicht. Wenn Sie die Apple UIPopoverController-Dokumentation anzeigen, sehen Sie, dass das Popover abgebrochen wird, indem Sie darauf tippen.

- (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]; 
}