如何从Popover中的button中解除UIPopover

我试图从Popover中的一个button解雇一个UIPopoverViewControler。 另外我希望它把数据传回主视图。 我有一个modalViewController工作,但不是一个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> { 

想法很简单。 YourViewController – 它是UIPopoverController的UIPopoverControllerMainViewController – 你创buildUIPopoverController控制器

  1. YourViewController中用dismiss方法声明协议
  2. YourViewController声明typesid<DismissDelegateProtocol>属性
  3. MainViewController声明支持DismissDelegateProtocol
  4. MainViewController实现DismissDelegateProtocol解除方法
  5. 当你在MainViewController创buildYourViewController时设置委托属性( yourViewController.delegate = self;
  6. 在动作中,那个button触动调用委托方法的响应: [self.delegate dismissWithData:dataToTransfer];

在代码中应该是这样的:

在MainViewController.h中

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

在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 } 

在YourViewController.h中

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

在YourViewController.m中

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

Sharrps的答案是非常好的,但是如果你展示了一个子类视图控制器,这个方法可能会稍微有些不同。

所以,如果你已经提交了UIViewController的子类,在它上面定义一个指向UIPopoverController的属性。 在您的呈现视图控制器中,实例化您的自定义视图控制器,使用所述自定义视图控制器实例化您的popup窗口,然后将自定义视图控制器的属性指向包含它的popup窗口控制器。

当需要解雇的时候,你的控制者会引用它的popup窗口,并可以将其解雇。 popup窗口也会有一个指向它的父视图控制器的指针,所以你可以通过原始的呈现视图控制器来执行你需要的关于你的模型的任何动作。

在上面的原始对话框“即时获取错误的行@class YourViewController:UIViewController {id委托;}它说我需要一个; – BDGapps”

答案很简单。 这是一种types。 将@class更改为@interface,一切正常。

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