Cómo eliminar UIPopover de un button en el Popover

Estoy intentando descartar un UIPopoverViewControler de un button en el Popover. Además, quiero que transfiera los datos a la vista principal. Lo tengo trabajando para un modalViewController pero no para un Popover. ¿Alguien sabe cómo puedo lograr esto?

// popover

- (IBAction) save:(id)sender { if ([self startDateIsValid] && [self endDateIsValid]) { [[self parentViewController] setDatesForEvent:startDate eventEndDate:endDate allDay:[allDaySwitch isOn]]; [self dismissModalViewControllerAnimated:YES]; } } 

// AddEventViewController_iPad

 #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import "dateViewPopOverViewController_iPad.h" @interface AddEventViewController_iPad : UIViewController <UITableViewDelegate,UITableViewDataSource, MFMailComposeViewControllerDelegate, UITextFieldDelegate, UIAlertViewDelegate,UIPopoverControllerDelegate,UINavigationControllerDelegate,UIPopoverControllerDelegate,ABPeoplePickerNavigationControllerDelegate, ABNewPersonViewControllerDelegate,DismissPopoverDelegate> { 

// datePopover

 #import <UIKit/UIKit.h> #import "AddEventViewController_iPad.h" @protocol DismissPopoverDelegate <NSObject> - (void) dismissWithData:(NSString *)data; @end @interface dateViewPopOverViewController_iPad : UIViewController<UIPopoverControllerDelegate> { 

Idea es simple YourViewController : es viewController de UIPopoverController . MainViewController : controller donde crea UIPopoverController

  1. Declare el protocolo en YourViewController con el método de YourViewController
  2. Declare la propiedad de tipo id<DismissDelegateProtocol> en YourViewController
  3. Declare el soporte de DismissDelegateProtocol en MainViewController
  4. Implementar el método de DismissDelegateProtocol de DismissDelegateProtocol en MainViewController
  5. Cuando crea YourViewController en MainViewController configure la propiedad de delegado ( yourViewController.delegate = self; )
  6. En acción, esa respuesta al button que toca el método delegado de llamada: [self.delegate dismissWithData:dataToTransfer];

En el código debería ser así:

En MainViewController.h :

 #import "YourViewController.h" @class MainViewController: UIViewController < DismissPopoverDelegate > 

En MainViewController.m :

 - (void) dismissPopover:(NSObject *)yourDataToTransfer { /* Dismiss you popover here and process data */ } ... // Some method, when you create popover { YourViewController *vc = ... ; vc.delegate = self; // this delegate property should be declanetworking as assign } 

En YourViewController.h :

 @protocol DismissPopoverDelegate - (void) dismissPopover:(NSObject *)yourDataToTransfer; @end @class YourViewController : UIViewController { id<DismissPopoverDelegate> delegate; } @property (nonatomic, assign) id<DismissPopoverDelegate> delegate; 

En YourViewController.m :

 - (void) methodWhenYouWantToDismissPopover { [self.delegate dismissPopover:data]; } 

La respuesta de Sharrps es perfectamente buena, pero aquí hay un enfoque ligeramente diferente que puede ser más rápido si presenta un controller de vista subclasificado.

Entonces, si ha subclasificado el UIViewController que se está presentando, defina una propiedad que apunte a un UIPopoverController. En su controller de vista de presentación, cree una instancia de su controller de vista personalizado, instale su popover con dicho controller de vista personalizado y luego asigne la propiedad de controller de vista personalizado a la propiedad para que apunte al controller emergente que lo contiene.

Cuando llegue el momento de descartar, su controller tiene una reference a su popover y puede descartarlo. El popover también tendrá un puntero a su controller de vista principal, por lo que puede realizar cualquier acción que necesite con respecto a su model a través de su controller de vista de presentación original.

En el dialog original arriba "estoy recibiendo un error en la línea @class YourViewController: UIViewController {id delegate;} dice que necesito a; – BDGapps"

La respuesta es muy simple. Es un tipo Cambia @ class a @interface y todo está bien.

 @protocol DismissPopoverDelegate - (void) dismissPopover:(NSObject *)yourDataToTransfer; @end @interface YourViewController : UIViewController { id<DismissPopoverDelegate> delegate; }