UIDocumentInteractionController presentOptionsMenuFromBarButtonItem ошибка в ios8- Неизвестные элементы активности, предоставленные
UIDocumentInteractionController
presentOptionsMenuFromBarButtonItem
дает мне консольную ошибку в оборудовании ios8 (а не на аппаратном обеспечении 7.1 или ранее):
Unknown activity items supplied: (
{
"com.adobe.pdf" = ;
},
""
)
В моей официальной версии App Store моего приложения приложение падает с этого момента. Когда я компилирую и запускаю на своем iPad, он просто дает ошибку, но не падает.
Мой код:
В .h:
UIDocumentInteractionController *docInteractionController;
В .m:
self.docInteractionController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];
self.docInteractionController.delegate = self;
//UIBarButtonItem *element is an element in my toolbar
[self.docInteractionController presentOptionsMenuFromBarButtonItem:element animated:YES];
Если я делаю NSLog
docInteractionController.UTI, я вижу "com.adobe.pdf" на консоли, поэтому UTI распознается должным образом.
Я могу обойти "Неизвестные элементы активности", используя presentOpenInMenuFromBarButtonItem вместо presentOptionsMenuFromBarButtonItem для вызова UIDocumentInteractionController, но я хочу показать пользователю параметры печати и электронной почты, а также не только параметры открытия внешнего приложения.
Протестировано на iPad версии 8.0.2. Xcode версии 6.0.1, цель развертывания 6.0 (также протестирована с целью развертывания 8.0). Все objective-c. Запуск версии iPad версии 7.1 не вызывает ошибки.
Ответы
Ответ 1
Смотрите радар: http://openradar.appspot.com/radar?id=5800473659441152
- Как уже отмечалось, вы можете использовать presentOpenInMenu вместо presentOptionsMenu. Вы потеряете почтовый параметр, но вы можете сделать это самостоятельно с помощью MFMailComposeViewController с выделенной почтовой кнопкой.
- Или используйте UIActivityViewController с элементом действия "Открыть в".
- Или просто UIActivityViewController без элемента "Открыть в", если этого достаточно.
- Или делать presentOptionsMenu в среде выполнения iOS7 и UIActivityViewController в среде iOS8 + (где существуют расширения общего доступа)
Ответ 2
Для людей, которые не хотят использовать UIActivityViewController
, потому что контроллер документа - это то, что мы хотим (все действия отображаются): вы можете обойти крушение, сохранив UIDocumentInteractionController
, например. путем присвоения ему свойства и освобождения при завершении взаимодействия с документом:
- (void)share:(id)sender
{
self.documentInteraction = [UIDocumentInteractionController interactionControllerWithURL:_shareURL];
_documentInteraction.delegate = self;
_documentInteraction.name = self.title;
[_documentInteraction presentOptionsMenuFromBarButtonItem:_actionItem animated:YES];
}
- (void)documentInteractionControllerDidDismissOptionsMenu:(UIDocumentInteractionController *)controller
{
if (controller == _documentInteraction) {
self.documentInteraction = nil;
}
}
Журнал по-прежнему будет отображаться, по крайней мере, в отладочном режиме, не проверяется с помощью сборки релиза. Но все это работает.
Ответ 3
Это решило проблему для меня:
dispatch_async(dispatch_get_main_queue(), ^() {
[_docController presentOptionsMenuFromRect:button.bounds inView:button animated:YES];
});
Ответ 4
Я получал одни и те же консольные журналы, но только в сборках отладки. Попробуйте создать сборку релизов, и вы должны увидеть, что она по-прежнему печатает сообщение "Неизвестные операции с товарами", но без всего содержимого файла.