UIPopoverController не закрывается при нажатии на панель навигации - PullRequest
17 голосов
/ 26 мая 2011

При нажатии на правую кнопку бара появляется UIPopoverController.

Проблема в том, что при нажатии на панель навигации этот контроллер UIPopover не закрывает.

Почему?И есть ли способ решить это?Я пытался найти, но ничего не могу найти по этому поводу.

Заранее спасибо.

Ответы [ 6 ]

30 голосов
/ 13 октября 2012

UIPopoverController, кажется, добавляет панель навигации к массиву passthroughViews при ее представлении. Я смог решить эту проблему, заново установив passthroughViews в пустой массив сразу после представления всплывающего окна.

5 голосов
/ 13 июля 2013

При запуске с кнопки панели вы можете просто сделать это

[popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[popoverController setPassthroughViews:nil];
1 голос
/ 21 ноября 2014

Элементы на панели навигации будут автоматически добавлены в passthroughViews popoverViewController.Это происходит после того, как появляется поповер.После этого вам необходимо очистить passthroughViews.

А для iOS 8 мы можем получить popoverController из UIViewController.popoverPresentationController, до этого мы можем получить popoverController из UIStoryboardPopoverSegue.

В вашем контроллере представления контроллер представления представлен как popover.

var popoverController: UIPopoverController?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Before IOS8, we need to get reference of popOverController from UIStoryboardPopoverSegue
    if (!self.respondsToSelector(Selector("popoverPresentationController"))) {
        if let popoverController = (segue as? UIStoryboardPopoverSegue)?.popoverController {
            let menuViewController = segue.destinationViewController as AIMSMenuTableViewController
            menuViewController.popoverController = popoverController
        }
    }
}

В вашем представлении контроллер, который представлен как popover.

var popoverController: UIPopoverController? 

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    // Set passthroughViews to nil make tapping other navigation bar button
    // dismiss presenting popoverController
    if (self.respondsToSelector(Selector("popoverPresentationController"))) {
        self.popoverPresentationController?.passthroughViews = nil
    } else {
        // For iOS8-pre version, we need to pass popoverController reference from segue
        self.popoverController?.passthroughViews = nil
    }
}
0 голосов
/ 25 февраля 2012

Насколько я могу судить, это ожидаемое поведение.Поповер на книжной полке в iBooks ведет себя так.Сохраните ссылку на всплывающее окно при его представлении, а затем отклоните его, если нажата какая-либо из кнопок на панели навигации.

0 голосов
/ 26 мая 2011

Вы помещаете этот код в любое другое действие или после завершения выбора или предоставляете некоторую кнопку закрытия в всплывающем окне и выполняете все действия,

[popOverControllerObj dismissPopoverAnimated:YES];
0 голосов
/ 26 мая 2011

Документация для UIPopoverController гласит:

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

Панель навигации добавляется как одна из passthroughViews при представлении всплывающего окнаиз элемента панели кнопок.

Возможно, попробуйте установить пустой массив как свойство passthroughViews на контроллере popover.

...