Как отклонить UIPopover с помощью кнопки в Popover

Я пытаюсь отключить UIPopoverViewControler с помощью кнопки в Popover. Кроме того, я хочу, чтобы данные были перенесены на основной экран. Я работаю над 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> {

Ответ 1

Идея проста. YourViewController - это viewController UIPopoverController. MainViewController - контроллер, в котором вы создаете UIPopoverController

  • Объявить протокол в YourViewController с методом отклонения
  • Объявить свойство типа id<DismissDelegateProtocol> в YourViewController
  • Объявить поддержку DismissDelegateProtocol в MainViewController
  • Внедрить метод удаления DismissDelegateProtocol в MainViewController
  • При создании YourViewController в MainViewController установите свойство делегата (yourViewController.delegate = self;)
  • В действии этот ответ на кнопку, касающуюся метода делегирования вызова: [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];
}

Ответ 2

Ответ Sharrps отлично подходит, но здесь немного другой подход, который может быть более быстрым, если вы представляете подклассовый контроллер представлений.

Итак, если вы подклассифицировали представленный UIViewController, определите свойство на нем, указывающее на UIPopoverController. В своем представлении диспетчера представлений создайте экземпляр своего настраиваемого контроллера представлений, создайте экземпляр своего popover с помощью указанного настраиваемого контроллера представлений, затем назначьте его настраиваемому контроллеру вида, чтобы он указывал на его контроллер.

Когда придет время уволить, ваш контроллер имеет ссылку на него popover и может отклонить его. У popover также будет указатель на его родительский контроллер представления, поэтому вы можете выполнять любые действия, которые вам нужны в отношении вашей модели, с помощью вашего исходного контроллера представления.

Ответ 3

В исходном диалоговом окне выше "im получение ошибки в строке @class YourViewController: UIViewController {id delegate;} он говорит, что мне нужно: - BDGapps"

Ответ очень прост. Это тип. Измените @class на @interface и все хорошо.

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


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