Как можно программно закрыть приложение Safari App Extension?

Я создаю расширение приложения Safari с помощью XCode 8.3 и Swift 3, следуя инструкциям по программированию расширения приложений Safari. Расширение включает в себя popover, который появляется при нажатии элемента панели расширения. Поперечное представление содержит несколько кнопок, связанных с действиями, которые пользователь может выполнить.

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

Я знаю, что у NSPopover есть метод performClose, но не существует способа получить доступ к самому popover изнутри расширения: расширение приложения позволяет вам предоставить SFSafariExtensionViewController, содержимое которого волшебным образом появляется внутри popover.

Я также попытался использовать dismissViewController как описано в qaru.site/info/8858680/..., но, на мой взгляд, контроллер self.presenting всегда равен нулю, а self.dismissViewController(self) просто сбрасывает расширение с помощью сообщения:

dismissViewController:: Error: maybe this view controller was not presented? ,

Наконец, я заметил, что связанный с этим вопрос о программном открытии элемента панели инструментов остался без ответа за последние 6 месяцев. Это заставляет меня подозревать, что Apple может просто иметь строгие ограничения на то, как можно открывать и закрывать popover. Даже если это так, было бы хорошо знать, каковы ограничения.

Ответ 1

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *) popoverController
{
    return true
}

Ответ 2

Я сделал это, вызвав метод dismiss, как показано ниже

@IBAction func onLoginBtnClicked (_ sender: Any) {
    NSLog("Button clicked")
    self.dismiss(self)
}

Ответ 3

Я добавлю ответ, если кто-нибудь наткнется на этот вопрос.

Метод экземпляра dismissPopover() добавлен в класс SFSafariExtensionViewController. Это может быть использовано для программного закрытия поповера.

Шаблон по умолчанию, указанный при создании Расширения приложения Safari в XCode, предоставляет класс SafariExtensionViewController, который расширяет SFSafariExtensionViewController и содержит общий экземпляр как статическое поле с именем "shared", поэтому вы можете вызывать метод dismissPopover() из этого экземпляра.

Например:

class SafariExtensionHandler: SFSafariExtensionHandler {
    func myFunc() {
        // do stuff;

        SafariExtensionViewController.shared.dismissPopover()

        // do other stuff;
    }
}