2

Ich versuche ein Popup mit einer benutzerdefinierten UIPopoverPresentationController-Klasse anzuzeigen. Aber es stürzt mit dem Fehler ab (<UIPopoverPresentationController: 0x7a772950>) should have a non-nil sourceView or barButtonItem set before the presentation occurs. Unten ist meine Schaltfläche klicken Code wo der Absturz auftritt.UIPopoverPresentationController sollte ein non-nil sourceView oder barButtonItem haben, bevor die Präsentation unter iOS 9 stattfindet.

- (IBAction)showPopup:(UIButton *)sender { 
ViewController *contentViewController = [[ViewController alloc] init]; 

    contentViewController.preferredContentSize = CGSizeMake(200, 200); 
    contentViewController.modalPresentationStyle = UIModalPresentationPopover; 
    myPopoverController *popOver = [[myPopoverController alloc]initWithPresentedViewController:contentViewController presentingViewController:self andTintColor:[UIColor lightGrayColor]]; 

    popOver.delegate = self; 
    popOver.permittedArrowDirections = UIPopoverArrowDirectionUp; 
    popOver.sourceRect = sender.frame; 
    popOver.sourceView = self.view; 
    [self presentViewController:contentViewController animated: YES completion: nil]; 
} 

Unten finden Sie ein Beispiel, wie meine Gewohnheit UIPopoverPresentationController sieht aus wie

myPopoverController.h file 

@interface myPopoverController : UIPopoverPresentationController 

@property (readonly) UIColor *tintColor; 


-(instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController presentingViewController:(UIViewController *)presentingViewController andTintColor:(UIColor *)aTintColor; 

@end 


myPopoverController.m file 

//Some code for UIPopoverBackgroundView 

-(instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController presentingViewController:(UIViewController *)presentingViewController 
{ 

    self = [self initWithPresentedViewController:presentedViewController presentingViewController:presentingViewController andTintColor: [UIColor redColor]]; 

    return self; 
} 


-(instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController presentingViewController:(UIViewController *)presentingViewController andTintColor:(UIColor *)aTintColor 
{ 

    self = [super initWithPresentedViewController:presentedViewController presentingViewController:presentingViewController]; 

    if (!self) { 
     return nil; 
    } 

    [super setPopoverBackgroundViewClass: [myPopoverControllerBackgroundView class]]; 
    tintColor = aTintColor; 


    return self; 
} 

Ich habe keinen barbutton haben, aber ich bin mit dem Sourceview Einstellung. Mache ich hier etwas falsch? Schätzen Sie Ihre Hilfe

Antwort

0

sein kann unter Code helfen könnte:

In iPad die View-Controller als popover angezeigt wird die neue UIPopoverPresentationController verwenden, erfordert es einen Ankerpunkt für die Präsentation des popover angeben über einen Link die drei folgenden Eigenschaften:

  1. barButtonItem
  2. sourceView
  3. sourceRect

wie folgt vorgehen:

//for iPhone 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 

    [self presentViewController:controller animated:YES completion:nil]; 

} 
//for iPad 
else { 
    // Change Rect as required 
    ViewController *contentViewController = [[ViewController alloc] init]; 

    contentViewController.preferredContentSize = CGSizeMake(200, 200); 
    contentViewController.modalPresentationStyle = UIModalPresentationPopover; 
    [self presentViewController:contentViewController animated:YES completion:nil]; 
} 
+0

UIPopoverController von iOS 9 ab – Gamerlegend

+0

Yeah ... Edited Antwort @ Gamerlegend ist veraltet –

5

Sie auch eine popover Präsentation Controller wie dies schaffen kann, und es kann

- (IBAction)showPopup:(UIButton *)sender { 

ViewController *contentViewController = [[ViewController alloc] init]; 
    contentViewController.preferredContentSize = CGSizeMake(200, 200); 
    contentViewController.modalPresentationStyle = UIModalPresentationPopover; 

UIPopoverPresentationController *popoverpresentationController = contentViewController.popoverPresentationController; 
    popoverpresentationController.delegate = self; 
    popoverpresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp; 
    popoverpresentationController.sourceRect = sender.bounds; 
    popoverpresentationController.sourceView = sender; 
    [self presentViewController:contentViewController animated: YES completion: nil]; 
} 
2

Du Subklassen die UIPopoverPresentationController aber Apple recommends arbeiten, um sie zu verwenden, wie Sie sind. Sobald Sie einen UIViewController präsentieren, wird automatisch ein UIPopoverPresentationController erstellt und Sie sollen es für Ihre Bedürfnisse ändern.

Sie erstellen eine myPopoverController Instanz aber Apple schafft eine andere, wenn Sie present Ihr contentViewController direkt nach:

[self presentViewController:contentViewController animated: YES completion: nil]; 

Diese neue UIPopoverPresentationController die sourceView fehlt und löst eine Ausnahme.

Versuchen Sie den Code unten statt:

ViewController *contentViewController = [[ViewController alloc] init]; 

// Present the view controller using the popover style. 
contentViewController.modalPresentationStyle = UIModalPresentationPopover; 
[self presentViewController:contentViewController 
        animated:YES 
       completion:nil]; 

// Get the popover presentation controller and configure it. 
UIPopoverPresentationController *presentationController =[contentViewController popoverPresentationController]; 
presentationController.permittedArrowDirections = UIPopoverArrowDirectionUp; 
presentationController.sourceView = sender.frame; 
presentationController.sourceRect = self.view; 
Verwandte Themen