Search code examples
xcodeuipopovercontroller

Dismiss popover when clicking a uibutton


I do have a popup view controller generated programmatically without a storyboard from the main view controller and would like to dismiss it once the input is being introduced by the user with a Done button on a tool bar at the popupview controller. I have been trying to use a protrocoll to dismiss the popover but it does not work. I have been fostering and applying several suggestions found in internet but all gave the same negative result. Do I oversee something?

Here is the relevant code:

Main View Controller .h

#import <UIKit/UIKit.h>
#import "PopOverContentVC.h"

@interface CCViewController : UIViewController <UIPopoverControllerDelegate, PopOverContentVCDelegate> {

UIPopoverController *detailViewPopover;
}

@property (retain, nonatomic) UIPopoverController *detailViewPopover;

@end

main view controller .m file

#import "PopOverContentVC.h"

@interface CCViewController ()

@end

@implementation CCViewController

@synthesize detailViewPopover;

...

- (void) dismissPopOverContentVC{

[detailViewPopover dismissPopoverAnimated:YES];
detailViewPopover = nil;
}

- (void) popOverSetUp{

PopOverContentVC *content = [[PopOverContentVC alloc] init];
detailViewPopover = [[UIPopoverController alloc] initWithContentViewController:content];
detailViewPopover.popoverContentSize = CGSizeMake(500., 150.);
detailViewPopover.delegate = self;
[detailViewPopover presentPopoverFromRect:[self coordinatesOfSegment]
                                   inView:self.spreadSheetView
                 permittedArrowDirections:UIPopoverArrowDirectionUp
                                 animated:YES];

- (void) segmentSelectedAtRow: (UISegmentedControl *)sender{

if (self.detailViewPopover) {

    [self.detailViewPopover dismissPopoverAnimated:YES];
    self.detailViewPopover = nil;
    [self popOverSetUp];

} else {

    [self popOverSetUp];
}
}

...
@end

popover view controller .h file

 #import <UIKit/UIKit.h>

 @class PopOverContentVC;

 @protocol PopOverContentVCDelegate <NSObject>

 - (void)dismissPopOverContentVC;

 @end

 @interface PopOverContentVC : UIViewController

 @property (assign, nonatomic) id <PopOverContentVCDelegate> delegate;

 - (void) doneButtonPressed:(id)sender;

 ...

@end

popover view controller .m file

#import "PopOverContentVC.h"
#import "CCViewController.h"

@interface PopOverContentVC ()


@property (strong, nonatomic) UIBarButtonItem *doneButton;

@end

@implementation PopOverContentVC
@synthesize delegate;

...


- (void) viewDidLoad {

     ...

      self.doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonPressed:)];

...
}

- (void) doneButtonPressed:(id)sender {

     [self.delegate dismissPopOverContentVC];

}

I have followed with NSLog all the steps and everything works well until after I press the done button [self.delegate dismissPopOverContentVC]; is not being executed and consequently I do not get to the main view controller to execute the method dismissPopOverContentVC for dismissing the popupview controller. What have I done wrong or did I miss something?

Thank you in advance for any hint.


Solution

  • Doesn't look to me like you're setting the delegate of your PopOverContentVC object - you're only setting the delegate of your UIPopoverController. In popoverSetup add

    content.delegate = self;
    

    after you've created the PopOverContentVC.