如何从 Popover 中的按钮关闭 UIPopover
我试图从弹出窗口中的按钮中关闭 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> {
//datePopover
#import <UIKit/UIKit.h>
#import "AddEventViewController_iPad.h"
@protocol DismissPopoverDelegate <NSObject>
- (void) dismissWithData:(NSString *)data;
@end
@interface dateViewPopOverViewController_iPad : UIViewController<UIPopoverControllerDelegate> {
I am trying to dismiss a UIPopoverViewControler from a button in the Popover. In addition I want it to transfer the data back to the main view. I have it working for a modalViewController but not for a Popover. Does anyone know how I can achieve this?
//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> {
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
想法很简单。
YourViewController
- 它是UIPopoverController
的viewController。MainViewController
- 您创建UIPopoverController
的控制器YourViewController
中使用解雇方法声明协议id
的属性在YourViewController
中DismissDelegateProtocol
的支持,在MainViewController
中DismissDelegateProtocol
的dismiss方法在MainViewController
中MainViewController
中创建YourViewController
时,设置委托属性 (yourViewController.delegate = self;
)[self.delegate dismissWithData:dataToTransfer];
在代码中应该是这样的:
In MainViewController.h:
In MainViewController.m:
在YourViewController.h中:
在YourViewController.m中:
Idea is simple.
YourViewController
- it's viewController ofUIPopoverController
.MainViewController
- controller where you createUIPopoverController
YourViewController
with dismiss methodid<DismissDelegateProtocol>
inYourViewController
DismissDelegateProtocol
inMainViewController
DismissDelegateProtocol
inMainViewController
YourViewController
inMainViewController
set delegate property (yourViewController.delegate = self;
)[self.delegate dismissWithData:dataToTransfer];
In code it should be like this:
In MainViewController.h:
In MainViewController.m:
In YourViewController.h:
In YourViewController.m:
Sharps 的答案非常好,但这里有一个稍微不同的方法,如果您提供子类化视图控制器,该方法可能会更快。
因此,如果您已经对所呈现的 UIViewController 进行了子类化,请在其上定义一个指向 UIPopoverController 的属性。在呈现视图控制器中,实例化您的自定义视图控制器,使用所述自定义视图控制器实例化您的弹出窗口,然后将自定义视图控制器的属性分配为指向包含它的弹出窗口控制器。
当需要关闭时,您的控制器会引用它的弹出窗口并可以关闭它。弹出窗口还将有一个指向其父视图控制器的指针,因此您可以通过原始呈现视图控制器对模型执行所需的任何操作。
Sharrps answer is perfectly good, but here's a slightly different approach that may be quicker if you're presenting a subclassed view controller.
So if you've subclassed the UIViewController that's being presented, define a property on it pointing to a UIPopoverController. In your presenting view controller, instantiate your custom view controller, instantiate your popover with said custom view controller, then assign the custom view controller it's property to point to the popover controller containing it.
When it comes time to dismiss, your controller has a reference to it's popover and can dismiss it. The popover will also have a pointer to it's parent view controller, so you can perform any actions you need with regards to your model via your original presenting view controller.
在上面的原始对话中,“我在 @class YourViewController : UIViewController { id delegate; } 行上遇到错误,它说我需要一个 ; – BDGapps”
答案非常简单。这是一种类型。将@class更改为@interface,一切都很好。
In the original dialogue above "im getting an error on the line @class YourViewController : UIViewController { id delegate; } it says i need a ; – BDGapps"
The answer is very simple. It's a type. Change @class to @interface and all is well.