Как убрать UIPopover с кнопки в Popover - PullRequest
10 голосов
/ 07 мая 2011

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

Ответы [ 3 ]

23 голосов
/ 07 мая 2011

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

  1. Объявление протокола в YourViewController с методом dismiss
  2. Объявление свойства типа id<DismissDelegateProtocol> в YourViewController
  3. Объявить поддержку DismissDelegateProtocol в MainViewController
  4. Реализовать метод dismiss of DismissDelegateProtocol в MainViewController
  5. При создании YourViewController в MainViewController установить свойство делегата (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;

In YourViewController.m :

- (void) methodWhenYouWantToDismissPopover
{
    [self.delegate dismissPopover:data];
}
11 голосов
/ 09 июля 2011

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

Так что, если вы подклассировали UIViewController, который представлен, определите для него свойство, указывающее на UIPopoverController. В представляемом контроллере представлений создайте экземпляр настраиваемого контроллера представлений, создайте экземпляр вашего всплывающего окна с помощью указанного настраиваемого контроллера представлений, а затем назначьте настраиваемый контроллер представлений, его свойство указывать на контроллер всплывающих окон, содержащий его.

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

1 голос
/ 26 ноября 2012

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

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

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


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