如何从 Popover 中的按钮关闭 UIPopover

发布于 2024-11-05 12:05:34 字数 1331 浏览 4 评论 0原文

我试图从弹出窗口中的按钮中关闭 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

若水般的淡然安静女子 2024-11-12 12:05:34

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

  1. YourViewController 中使用解雇方法声明协议
  2. 声明类型为 id 的属性在YourViewController
  3. 声明对DismissDelegateProtocol的支持,在MainViewController
  4. 实现DismissDelegateProtocol的dismiss方法在MainViewController
  5. 当您在 MainViewController 中创建 YourViewController 时,设置委托属性 (yourViewController.delegate = self;)
  6. 在操作中,对按钮触摸的响应调用委托方法: [self.delegate dismissWithData:dataToTransfer];

在代码中应该是这样的:

In MainViewController.h:

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

In 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];
}

Idea is simple. YourViewController - it's viewController of UIPopoverController. MainViewController - controller where you create UIPopoverController

  1. Declare protocol in YourViewController with dismiss method
  2. Declare property of type id<DismissDelegateProtocol> in YourViewController
  3. Declare support of DismissDelegateProtocol in MainViewController
  4. Implement dismiss method of DismissDelegateProtocol in MainViewController
  5. When you create YourViewController in MainViewController set delegate property (yourViewController.delegate = self;)
  6. 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 >

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

In YourViewController.h:

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

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

@property (nonatomic, assign) id<DismissPopoverDelegate> delegate;

In YourViewController.m:

- (void) methodWhenYouWantToDismissPopover
{
    [self.delegate dismissPopover:data];
}
静若繁花 2024-11-12 12:05:34

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.

幸福丶如此 2024-11-12 12:05:34

在上面的原始对话中,“我在 @class YourViewController : UIViewController { id delegate; } 行上遇到错误,它说我需要一个 ; – BDGapps”

答案非常简单。这是一种类型。将@class更改为@interface,一切都很好。

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


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

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.

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


@interface YourViewController : UIViewController {
    id<DismissPopoverDelegate> delegate;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文