Search code examples
objective-cuiviewuiviewcontrollerios7uipopover

-[UIPopoverController dealloc] reached while popover is still visible


I have a class (ViewOpenAppointments) where I create and display a UIPopover. This is the code to define the popover in my .h file:

@interface ViewOpenAppointments : UIView  {

}

@property (nonatomic, retain) UIPopoverController *popoverController;
-(void)createOpenAppointmentsPopover: (UIButton *) obViewOpenAppts;
@end

I have a check in the code that if the popover is visible, dismiss it. This is the code:

    //  create popover
UIViewController* popoverContent = [[UIViewController alloc] init];
//    UIView *popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 650, 416)];
ViewOpenAppointments *popoverView = [[ViewOpenAppointments alloc]     initWithFrame:CGRectMake(0, 0, 650, 416)];

popoverView.backgroundColor = [UIColor whiteColor];
popoverContent.preferredContentSize = CGSizeMake(650.0, 416.0);

//  create the popover controller
popoverController = [[UIPopoverController alloc]  initWithContentViewController:popoverContent];
popoverController.delegate = (id)self;
[popoverController setPopoverContentSize:CGSizeMake(650, 416) animated:NO];

if ([popoverController isPopoverVisible]) {
    [popoverController dismissPopoverAnimated:YES];
}

[popoverController presentPopoverFromRect:CGRectMake(650, 416, 10, 50) inView: obViewOpenAppts
                 permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

The problem is that the code to dismiss the popover is never hit, which means it's not visible. But I still get the error message (described in the question title).

What am I doing wrong?


Solution

  • Here is a complete popover management example:

    @interface ViewController () <UIPopoverControllerDelegate>
    @property (nonatomic, strong) UIPopoverController* currentPop;
    @end
    
    @implementation ViewController     
    
    -(IBAction)doPopover1:(id)sender {
        Popover1View1* vc = [[Popover1View1 alloc] initWithNibName:@"Popover1View1" bundle:nil];
    
        UIPopoverController* pop = [[UIPopoverController alloc] initWithContentViewController:vc];
        self.currentPop = pop;
        [pop presentPopoverFromBarButtonItem:sender
                    permittedArrowDirections:UIPopoverArrowDirectionAny
                                    animated:YES];
        pop.passthroughViews = nil;
        // make ourselves delegate so we learn when popover is dismissed
        pop.delegate = self;
    }
    
    - (void)popoverControllerDidDismissPopover:(UIPopoverController *)pc {
        self.currentPop = nil;
    }
    

    By checking self.currentPop you can make sure you don't present two popovers at once (illegal anyway).