如何从Popover中的按钮关闭UIPopover

时间:2011-05-07 16:01:34

标签: objective-c xcode ios ipad uipopovercontroller

我试图从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> {

// datePopover

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

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

@end

@interface dateViewPopOverViewController_iPad : UIViewController<UIPopoverControllerDelegate> {

3 个答案:

答案 0 :(得分:23)

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

的控制器
  1. 使用dismiss方法
  2. YourViewController中声明协议
  3. id<DismissDelegateProtocol>
  4. 中声明YourViewController类型的媒体资源
  5. DismissDelegateProtocol
  6. 中声明对MainViewController的支持
  7. DismissDelegateProtocol
  8. 中实施MainViewController的解雇方法
  9. YourViewController设置委托属性(MainViewController
  10. 中创建yourViewController.delegate = self;
  11. 在操作中,对按钮触摸调用委托方法的响应:[self.delegate dismissWithData:dataToTransfer];
  12. 在代码中它应该是这样的:

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

答案 1 :(得分:11)

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

因此,如果您已经为要呈现的UIViewController创建了子类,请在其上定义一个指向UIPopoverController的属性。在您的呈现视图控制器中,实例化您的自定义视图控制器,使用所述自定义视图控制器实例化您的弹出框,然后将自定义视图控制器的属性指定为指向包含它的弹出控制器。

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

答案 2 :(得分:1)

在上面的原始对话框中“我在线上获得错误@class YourViewController:UIViewController {id delegate;}它说我需要一个; - BDGapps”

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

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


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