Представление View Controller на iPad позволяет использовать только .Popover

У меня есть приложение для iPhone, которое я пытаюсь сделать универсальным. У меня есть этот код:

let documentMenu = UIDocumentMenuViewController(documentTypes: [kUTTypeContent as String], inMode: .Import)
documentMenu.modalPresentationStyle = .FormSheet
documentMenu.delegate = self
self.presentationContext.presentViewController(documentMenu, animated: true, completion: nil)

self.presentationContext — это просто контроллер представления, переданный в класс.

Каждый раз, когда этот код выполняется, возникает эта ошибка:

Ваше приложение представило UIDocumentMenuViewController(). В текущей среде трейта modalPresentationStyle UIDocumentMenuViewController с этим стилем — UIModalPresentationPopover. Вы должны предоставить информацию о местоположении для этого всплывающего окна через popoverPresentationController контроллера представления. Вы должны предоставить либо sourceView и sourceRect, либо barButtonItem. Если эта информация неизвестна при представлении контроллера представления, вы можете указать ее в методе UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation.

Я не уверен, что происходит. Я даже пытался установить sourceView и sourceRect, чтобы остановить ошибку, однако он втыкает DocumentMenuViewController в всплывающее окно, я не знаю, что это такое. Мне нужно, чтобы это было модально представлено в центре экрана. Любая помощь приветствуется.


person crizzwald    schedule 15.11.2016    source источник


Ответы (3)


Следующий код работает нормально

let importMenu = UIDocumentMenuViewController(documentTypes: [String(kUTTypePDF)], in: .import)

    importMenu.popoverPresentationController?.sourceView = self.view // so that iPads won't crash

    importMenu.delegate = self
    importMenu.modalPresentationStyle = .formSheet
    self.present(importMenu, animated: true, completion: nil)
person Guri S    schedule 09.02.2019

Проблема в том, что UIDocumentMenuViewController не хочет отображаться как что-либо иное, кроме как в виде меньшего стиля представления "всплывающее окно". Его собственная реализация переопределяет любые настройки его modalPresentationStyle до .Popover. Таким образом, ваша попытка установить стиль .FormSheet в конечном итоге будет проигнорирована.

Это то, что вызывает ошибку. Как только стиль будет .Popover, вы должны сделать то, что указывает ошибка, и установить подходящую комбинацию sourceView и sourceRect или barButtonItem.

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

person rmaddy    schedule 15.11.2016
comment
Я не утверждаю, что вы ошибаетесь, но есть ли какие-либо документы, подтверждающие ваше утверждение? - person crizzwald; 15.11.2016
comment
К сожалению нет. Мой ответ основан на практическом опыте работы с UIDocumentMenuViewController, и ваш собственный опыт из вашего вопроса совпадает с тем, что я видел. - person rmaddy; 15.11.2016

мои два цента для Mac Catalyst:

на Mac Catalyst вы должны использовать .formSheet

so:

   #if targetEnvironment(macCatalyst)
    let modalPresentationStyle : UIModalPresentationStyle = .formSheet
    #else
    let modalPresentationStyle : UIModalPresentationStyle = .popover
    #endif

    optionsVC.modalPresentationStyle = modalPresentationStyle
    optionsVC.popoverPresentationController?.sourceView = self.view

    self.present(optionsVC, animated: true) {
    }

в итоге добавить:

optionsVC.modalPresentationStyle = modalPresentationStyle

чтобы предотвратить нажатие снаружи, закроется без вызова обратных вызовов (только для iOS13 / Catalyst)

person ingconti    schedule 19.06.2020