【问题标题】:How to dismiss UIPopover from a button in the Popover如何从弹出窗口中的按钮关闭 UIPopover
【发布时间】:2011-08-20 19:18:23
【问题描述】:

我正在尝试从 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];

    }

}

//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> {

【问题讨论】:

    标签: objective-c xcode ios ipad uipopovercontroller


    【解决方案1】:

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

    1. 用dismiss方法在YourViewController中声明协议
    2. YourViewController 中声明id&lt;DismissDelegateProtocol&gt; 类型的属性
    3. MainViewController 中声明支持DismissDelegateProtocol
    4. MainViewController中实现DismissDelegateProtocol的dismiss方法
    5. MainViewController 中创建YourViewController 时设置委托属性(yourViewController.delegate = self;)
    6. 实际上,对按钮触摸调用委托方法的响应:[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];
    }
    

    【讨论】:

    • 我在@class YourViewController : UIViewController { id delegate; } 它说我需要一个 ;
    • 它说我需要一个;而是在 @class AddEventViewController_iPad : UIViewController
    • 你认为 YourViewController.h 和 MainViewController.h 是什么
    • 看看我更新的帖子。 YourViewController - 它是 UIPopoverController 的 viewController。 MainViewController - 创建 UIPopoverController 的控制器
    • 我已经为您创建了示例项目。得到它here
    【解决方案2】:

    Sharrps 的答案非常好,但如果您要呈现子类视图控制器,这里有一种稍微不同的方法可能会更快。

    因此,如果您对正在呈现的 UIViewController 进行了子类化,请在其上定义一个指向 UIPopoverController 的属性。在您的呈现视图控制器中,实例化您的自定义视图控制器,使用所述自定义视图控制器实例化您的弹出框,然后将其属性分配给自定义视图控制器以指向包含它的弹出框控制器。

    当需要关闭时,您的控制器会引用它的弹出框并可以关闭它。弹出框还将有一个指向其父视图控制器的指针,因此您可以通过原始呈现视图控制器对模型执行所需的任何操作。

    【讨论】:

    • 这很聪明。我要回避接受的答案,走这条路。苹果应该让这更简单。当你让一个人出去,他说,让我父亲带我走,这会很烦人。
    • 比接受的答案更容易 - 习惯于以这种方式在类之间传递对象和数据,但没有想到在所提供的 VC 中实现像这样消除弹出框。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多