如何从Popover中的按钮关闭UIPopover

BDG*_*pps 10 xcode objective-c ipad uipopovercontroller ios

我试图从Popover中的按钮中解除UIPopoverViewControler.另外我希望它将数据传回主视图.我有一个modalViewController但不适用于Popover.有谁知道我怎么能做到这一点?

//酥料饼

- (IBAction) save:(id)sender
{
    if ([self startDateIsValid] && [self endDateIsValid]) 
    {

        [[self parentViewController] setDatesForEvent:startDate eventEndDate:endDate allDay:[allDaySwitch isOn]];
        [self dismissModalViewControllerAnimated:YES];

    }

}
Run Code Online (Sandbox Code Playgroud)

// 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> {
Run Code Online (Sandbox Code Playgroud)

// datePopover

#import <UIKit/UIKit.h>
#import "AddEventViewController_iPad.h"
@protocol DismissPopoverDelegate <NSObject>

- (void) dismissWithData:(NSString *)data;

@end

@interface dateViewPopOverViewController_iPad : UIViewController<UIPopoverControllerDelegate> {
Run Code Online (Sandbox Code Playgroud)

5hr*_*hrp 23

想法很简单.YourViewController- 它的viewController UIPopoverController.MainViewController - 您创建的控制器UIPopoverController

  1. YourViewController用dismiss方法声明协议
  2. 声明类型的财产id<DismissDelegateProtocol>YourViewController
  3. 声明支持DismissDelegateProtocolMainViewController
  4. 实行解雇的方法DismissDelegateProtocolMainViewController
  5. YourViewControllerMainViewControllerset delegate property(yourViewController.delegate = self;)中创建时
  6. 在行动中,该按钮触摸调用委托方法的响应: [self.delegate dismissWithData:dataToTransfer];

在代码中它应该是这样的:

在MainViewController.h中:

#import "YourViewController.h"
@class MainViewController: UIViewController < DismissPopoverDelegate >
Run Code Online (Sandbox Code Playgroud)

在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
}
Run Code Online (Sandbox Code Playgroud)

在YourViewController.h中:

@protocol DismissPopoverDelegate
- (void) dismissPopover:(NSObject *)yourDataToTransfer;
@end

@class YourViewController : UIViewController
{
    id<DismissPopoverDelegate> delegate;
}

@property (nonatomic, assign) id<DismissPopoverDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

在YourViewController.m中:

- (void) methodWhenYouWantToDismissPopover
{
    [self.delegate dismissPopover:data];
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经为你创建了示例项目.得到它[这里](http://dl.dropbox.com/u/8107006/PopoverExample.zip) (4认同)

isa*_*aac 11

Sharrps的回答非常好,但是如果您要呈现一个子类视图控制器,这里的方法可能会更快一些.

因此,如果您已经为要呈现的UIViewController创建了子类,请在其上定义一个指向UIPopoverController的属性.在您呈现视图控制器,实例化您的自定义视图控制器,与该自定义视图控制器实例化你的酥料饼,然后指定自定义视图控制器它的属性设置为指向包含它的酥料饼的控制器.

当需要解雇时,你的控制器会引用它的弹出并且可以解雇它.弹出窗口还有一个指向它的父视图控制器的指针,因此您可以通过原始呈现视图控制器执行与模型相关的任何操作.

  • 这很聪明.我将避开已接受的答案并采取这种方式.Apple应该让这更简单.当你要求一个人离开他说,请求我的父亲把我带走,这可能很烦人. (3认同)