2011-05-07 13 views
10

Estoy tratando de descartar un UIPopoverViewControler de un botón 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?Cómo descartar UIPopover de un botón en el Popover

// 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> { 

Respuesta

23

idea es simple. YourViewController - es viewController de UIPopoverController. MainViewController - controlador donde se crea UIPopoverController

  1. protocolo Declare en YourViewController con despedir método
  2. Declarar propiedad de tipo id<DismissDelegateProtocol> en YourViewController
  3. apoyo Declarar de DismissDelegateProtocol en MainViewController
  4. Implementar despedir método de DismissDelegateProtocol en MainViewController
  5. Cuando crea YourViewController en MainViewController s et propiedad delegado (yourViewController.delegate = self;)
  6. En la acción, que la respuesta al método de botón de llamada tocando delegado: [self.delegate dismissWithData:dataToTransfer];

En el código que debe 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 declared 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]; 
} 
+0

im conseguir un error en la línea @class YourViewController: UIViewController { id delegado; } dice que necesito una; – BDGapps

+0

¿Qué tipo de error has recibido? – 5hrp

+0

dice que necesito un; en su lugar en @class AddEventViewController_iPad: UIViewController – BDGapps

11

Sharrps respuesta es perfectamente bueno, pero aquí hay un enfoque ligeramente diferente que puede ser más rápido si está presentando un controlador de vista subclasificado.

Así que si ha subclasificado el UIViewController que se está presentando, defina una propiedad en él apuntando a un UIPopoverController. En su controlador de vista de presentación, cree una instancia de su controlador de vista personalizado, cree una instancia de su popover con dicho controlador de vista personalizado, luego asigne al controlador de vista personalizado su propiedad para apuntar al controlador de popover que lo contiene.

Cuando llega el momento de despedir, su controlador tiene una referencia a su Popover y puede descartarlo.El popover también tendrá un puntero a su controlador de vista principal, por lo que puede realizar cualquier acción que necesite con respecto a su modelo a través de su controlador de vista original.

+3

Esto es inteligente. Voy a rechazar la respuesta aceptada y seguir por este camino. Apple debería haber hecho esto más simple. Cuando le pides a un compañero que salga y él dice, pídele a mi padre que me lleve, puede ser bastante molesto. – gigahari

+0

Mucho más fácil que la respuesta aceptada. Estoy acostumbrado a pasar objetos y datos entre las clases de esta manera, pero no pensé en implementar descartar el popover de esta manera dentro del VC presentado. –

1

En el diálogo original, por encima de "im conseguir un error en la línea @class YourViewController: UIViewController {delegado Identificación;} dice que necesito una; - 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; 
} 
Cuestiones relacionadas