Как настроить представления Popover, чтобы уволить должным образом - PullRequest
6 голосов
/ 08 февраля 2011

После некоторой работы у меня есть всплывающее окно с отображением пользовательского интерфейса внутри, которое отображается правильно.Когда вы нажимаете за пределами представления всплывающего окна, оно отклоняется, как и ожидалось, однако я также хотел бы, чтобы оно отклонялось при нажатии на кнопку внутри него, есть ли кто-нибудь, кто может мне помочь с этим?Изо всех сил, чтобы найти краткое руководство.

1 Ответ

12 голосов
/ 09 февраля 2011

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

Чтобы кнопка внутри контроллера представления контента говорила оригинальному контроллеру представления (который представил popover) отклонить popover, два из возможных способовявляются делегатом + протокол или NSNotificationCenter.

В приведенном ниже примере кода используется NSNotificationCenter .

В .h контроллера представления, представляющего всплывающее окно ("PresenterViewController"),добавить свойство для popoverViewController:

@interface PresenterViewController : UIViewController {
    ...
    UIPopoverController *popoverController;
}    
...
@property (nonatomic, retain) UIPopoverController *popoverController;
@end

В .m PresenterViewController:

@synthesize popoverController;
...
- (void)showPopover
{
    if (self.popoverController == nil)
    {
        ContentFooViewController *content = 
            [[ContentFooViewController alloc] init];
        UIPopoverController *popover = [[UIPopoverController alloc] 
            initWithContentViewController:content];
        [content release];
        self.popoverController = popover;
        [popover release];

        // Listen for the "done" notification which will be posted
        // by the button in the content view controller.
        // When the notification is received, 
        // call the contentFooViewControllerDone: method...
        [[NSNotificationCenter defaultCenter] 
            addObserver:self
            selector:@selector(contentFooViewControllerDone:)
            name:@"contentFooViewControllerDone" 
            object:popoverController.contentViewController];
    }

    [self.popoverController presentPopoverFromRect:...
      // OR
    [self.popoverController presentPopoverFromBarButtonItem:...
}

- (void)contentFooViewControllerDone:(NSNotification *)notification
{
    // Button in content view controller was tapped, dismiss popover...
    [self.popoverController dismissPopoverAnimated:YES];
}

- (void)dealloc 
{
    //stop listening for notifications and release popoverController...
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [popoverController release];
    [super dealloc];
}

В контроллере представления содержимого реализуйте метод нажатия кнопки следующим образом:

- (IBAction)dismissButtonTapped
{
    [[NSNotificationCenter defaultCenter] 
        postNotificationName:@"contentFooViewControllerDone" object:self];
}
...