Ответ 1
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *) popoverController
{
return true
}
Я создаю расширение приложения 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. Даже если это так, было бы хорошо знать, каковы ограничения.
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *) popoverController
{
return true
}
Я сделал это, вызвав метод dismiss, как показано ниже
@IBAction func onLoginBtnClicked (_ sender: Any) {
NSLog("Button clicked")
self.dismiss(self)
}
Я добавлю ответ, если кто-нибудь наткнется на этот вопрос.
Метод экземпляра dismissPopover() добавлен в класс SFSafariExtensionViewController. Это может быть использовано для программного закрытия поповера.
Шаблон по умолчанию, указанный при создании Расширения приложения Safari в XCode, предоставляет класс SafariExtensionViewController, который расширяет SFSafariExtensionViewController и содержит общий экземпляр как статическое поле с именем "shared", поэтому вы можете вызывать метод dismissPopover() из этого экземпляра.
Например:
class SafariExtensionHandler: SFSafariExtensionHandler {
func myFunc() {
// do stuff;
SafariExtensionViewController.shared.dismissPopover()
// do other stuff;
}
}