Reject popover using UIbutton

I can’t understand why it doesn’t work properly, when I try to reject a popover by clicking on UIButton, which itself is on a popover, which will be rejected, my project will fail ...

- (IBAction) cancelButton: (id) sender{ //[self dismissPopoverAnimated:YES]; } 

Above is my code for my UIButton

+4
source share
3 answers

Do not reject the popover from the inside out. Create a protocol that sends a message to its delegate and then rejects it. For example, your popover view controller might look like this.

 // MyPopoverViewController.h @protocol MyPopoverDelegate <NSObject> -(void)didClickCancelButton; @end @interface MyPopoverViewController : UIViewController { } @property (nonatomic, assign) id<MyPopoverDelegate> delegate; -(IBAction)cancelButton; @end // MyPopoverViewController.m #import "MyPopoverViewController.h" @implementation MyPopoverViewController @synthesize delegate; // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. /* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; } */ -(IBAction)cancelButton { [self.delegate didClickCancelButton]; } #pragma mark - #pragma mark Rotation support - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Overriden to allow any orientation. return YES; } #pragma mark - #pragma mark Memory Management - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; } - (void)dealloc { [super dealloc]; } @end 

And then you can use ..

 // ClassImplementingPopoverController.h #import <UIKit/UIKit.h> #import "MyPopoverViewController.h" @interface ClassImplementingPopoverController : UIViewController <UIPopoverControllerDelegate, MyPopoverDelegate> { UIPopoverController *myPopoverController; } @property (nonatomic, retain) UIPopoverController *myPopoverController; @end // ClassImplementingPopoverController.m #import "ClassImplementingPopoverController.h" #import "MyPopoverViewController.h" @implementation ClassImplementingPopoverController @synthesize myPopoverController; #pragma mark - #pragma mark View lifecycle - (void)viewDidLoad { [super viewDidLoad]; } // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return YES; } #pragma mark - #pragma mark MyPopover delegate -(void)didClickCancelButton { if ([myPopoverController isPopoverVisible]) { [myPopoverController dismissPopoverAnimated:YES]; [myPopoverController release]; } } #pragma mark - #pragma mark UIPopoverController delegate -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { if (popoverController == myPopoverController) { [myPopoverController release]; } } /* Use something like this to create your popover, just make sure you set the delegate to self so you can receive the messages NSLog(@"Displaying Popover!"); MyPopoverViewController *detailViewController = [[MyPopoverViewController alloc] initWithNibName:@"MyPopoverViewController" bundle:nil]; [detailViewController setDelegate:self]; // Pass the selected object to the new view controller. myPopoverController = [[UIPopoverController alloc] initWithContentViewController:detailViewController]; [detailViewController release]; myPopoverController.popoverContentSize = CGSizeMake(500.0, 150.0); [myPopoverController setDelegate:self]; */ #pragma mark - #pragma mark Memory management - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Relinquish ownership any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. // For example: self.myOutlet = nil; self.myPopoverController = nil; } - (void)dealloc { [myPopoverController release]; [super dealloc]; } @end 
+19
source

you can use KVC to access the "popoverController", for example

 [self valueForKey:@"popoverController"] 

But it is potentially rejected by the AppStore if they discover that your code uses its “private API”.

+3
source

rejectPopoverAnimated is a property of the PopoverController itself, not your custom VC. You are showing IBAction on the "I", which suggests that you are inside your class here. (If this is not correct, send more surrounding code.)

VC cannot directly fall into its encompassing popover; you just need to save the link to it in the VC that created it so that you can hit it with a deviation from there.

You can fire Popover from the inside, which is not a glitch.

0
source

All Articles