如何从Popover中的按钮关闭UIPopover

12

我正在尝试从弹出窗口中的按钮关闭UIPopoverViewControler。此外,我希望它将数据传回主视图。我已经让modalViewController正常工作,但是对于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> {

//日期弹出框

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

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

@end

@interface dateViewPopOverViewController_iPad : UIViewController<UIPopoverControllerDelegate> {
3个回答

23
Idea is simple. YourViewController - it's viewController of UIPopoverController. MainViewController - controller where you create UIPopoverController Declare protocol in YourViewController with dismiss method Declare property of type id in YourViewController Declare support of DismissDelegateProtocol in MainViewController Implement dismiss method of DismissDelegateProtocol in MainViewController When you create YourViewController in MainViewController set delegate property (yourViewController.delegate = self;) In action, that response to button touching call delegate method: [self.delegate dismissWithData:dataToTransfer];
In code it should be like this:
In 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
}

在你的视图控制器.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];
}

将 @class MainViewController: UIViewController <DismissPopoverDelegate> 放在我导入所有内容的接口上面并不能解决问题,我仍然遇到相同的错误。 - BDGapps
请再读一遍我的回答。我已经尽可能清楚地描述了所有内容。 - 5hrp
4
我已经为您创建了一个示例项目。在此处获取它:http://dl.dropbox.com/u/8107006/PopoverExample.zip - 5hrp
这似乎是您通常处理UIModalViewController的方式。我希望苹果公司能够为UIViewController添加对此类事情的支持...即使他们只是定义了回调委托并由您实现它。 - LightningStryk
我觉得我无法为这个答案投票了。真他妈的棒!谢谢! - Andra Todorescu
显示剩余11条评论

12

Sharrps的回答非常好,但是这里提供一个略有不同的方法,如果您正在呈现一个子类化的视图控制器,则可能更快。

所以,如果您已经对被呈现的UIViewController进行了子类化,请在其上定义一个指向UIPopoverController的属性。在您的呈现视图控制器中,实例化您的自定义视图控制器,用该自定义视图控制器实例化popover,然后将自定义视图控制器的属性分配给包含它的popover控制器。

当需要关闭时,您的控制器已经引用了它的popover并可以将其关闭。popover也会有一个指向其父视图控制器的指针,因此您可以通过原始的呈现视图控制器执行与模型相关的任何操作。


3
这很聪明。我将避开被认可的答案,选择这种方式。苹果应该让这个更简单。当你要求一个人离开,他说,请问我的父亲来接我,这可能会非常恼人。 - gigahari
比接受的答案要容易得多——我习惯于在类之间传递对象和数据,但没有想到可以从呈现的视图控制器中实现取消弹出窗口。 - Evan R

1

在上面的对话中,“我在@class YourViewController : UIViewController { id delegate; }这一行遇到了一个错误,它说我需要一个分号- BDGapps。”

答案非常简单。这是一个类型错误。将@class更改为@interface,一切都会好起来。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接