В настоящее время я тестирую свое приложение с Xcode 6 (бета-версия 6). UIActivityViewController отлично работает с устройствами и симуляторами iPhone, но вылетает на симуляторах iPad и устройствах (iOS 8) со следующими журналами
Terminating app due to uncaught exception 'NSGenericException',
reason: 'UIPopoverPresentationController
(<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>)
should have a non-nil sourceView or barButtonItem set before the presentation occurs.
Я использую следующий код для iPhone и iPad как для iOS 7, так и для iOS 8
NSData *myData = [NSData dataWithContentsOfFile:_filename];
NSArray *activityItems = [NSArray arrayWithObjects:myData, nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:nil applicationActivities:nil];
activityViewController.excludedActivityTypes = @[UIActivityTypeCopyToPasteboard];
[self presentViewController:activityViewController animated:YES completion:nil];
Я получаю похожий сбой одного из моих других приложений. Можете ли вы вести меня? что-нибудь изменилось с UIActivityViewController в iOS 8? Я проверил, но я ничего не нашел по этому
ios
objective-c
ios8
uiactivityviewcontroller
Бхумит Мехта
источник
источник
Ответы:
На iPad контроллер представления активности будет отображаться в виде всплывающего окна с использованием нового UIPopoverPresentationController , для этого необходимо указать опорную точку для представления всплывающего окна, используя одно из трех следующих свойств:
Чтобы указать точку привязки, вам необходимо получить ссылку на UIPopoverPresentationController UIActivityController и установить одно из следующих свойств:
источник
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
Та же проблема пришла в мой проект, тогда я нашел решение, чтобы открыть
UIActivityViewController
в iPad, мы должны использоватьUIPopoverController
Вот код для использования в iPhone и iPad:
Для swift 4.2 / swift 5
источник
Недавно я столкнулся с этой проблемой (первоначальный вопрос) в Swift 2.0, где он
UIActivityViewController
отлично работал на iPhone, но вызывал сбои при моделировании iPad.Я просто хочу добавить к этой ветке ответов, что, по крайней мере, в Swift 2.0 вам не нужно выражение if. Вы можете просто сделать
popoverPresentationController
опциональным.Коротко говоря, принятый ответ, по-видимому, гласит, что вы можете иметь только sourceView, просто sourceRect или просто barButtonItem, но в соответствии с документацией Apple для UIPopoverPresentationController вам необходимо одно из следующего:
Ниже приведен конкретный пример, над которым я работал, где я создаю функцию, которая принимает
UIView
(для sourceView и sourceRect) иString
(единственный ActivityItem объекта UIActivityViewController).Этот код работает на iPhone и iPad (и даже на tvOS, я думаю) - если устройство не поддерживает
popoverPresentationController
, две строки кода, в которых он упоминается, по существу игнорируются.Приятно, что все, что вам нужно сделать, чтобы это работало на iPad, - это просто добавить две строки кода или одну, если вы используете barButtonItem!
источник
respondsToSelector
илиUIUserInterfaceIdiom
, похоже, оно гораздо лучше подходит Swift как языку. ХотяrespondsToSelector
кажется, что это необходимо для iOS7, если вы используете более новые версии iOS, это определенно будет правильным решением.Я вижу, как многие люди жестко кодируют iPhone / iPad и т. Д. При использовании кода Swift.
Это не нужно, вы должны использовать языковые функции. Следующий код предполагает , что вы будете использовать UIBarButtonItem и будет работать на обоих iPhone и IPad.
Обратите внимание на то, что в нем нет утверждений If или любой другой сумасшедшей вещи. Опциональная распаковка будет нулевой на iPhone, поэтому линия
vc.popoverPresentationController?
не будет ничего делать на iPhone.источник
vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
прежде чем представить контроллер представления.shareTapped()
:vc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
оба все еще разбились. Что я делаю не так? в то время как я здесь, как мне заполнить поповер различными службами обмена, такими как Facebook, Twitter и т. д.?sender
это действительноUIBarButtonItem
. Проверьте, что vc нетnil
. Проверьте, что вы можете представить ViewController ... не глядя на сбой / код трудно сказать. Службы будут автоматически заполняться, если у пользователя установлено приложение (если вы явно не решили исключить некоторые из них).Решение с использованием Xamarin.iOS.
В моем примере я делаю снимок экрана, производя изображение и позволяя пользователю поделиться изображением. Всплывающее окно на iPad расположено посередине экрана.
источник
Swift, iOS 9/10 (после того, как UIPopoverController устарел)
источник
В Swift, чтобы исправить это для iPad, лучший способ сделать это, как я нашел.
источник
Если вы показываете,
UIActivityViewController
когда нажимаете наUIBarButtonItem
использование, используйте следующий код:В противном случае, если вы используете другой элемент управления, например a
UIButton
, используйте следующий код:От документации до
UIPopoverPresentationController
:источник
Исправление для Swift 2.0
источник
Свифт 3:
источник
Swift:
источник
Решение для Objective-C и с использованием UIPopoverPresentationController
источник
Я попробовал следующий код, и он работает:
сначала вставьте элемент панели кнопок в свой View Controller, затем создайте IBOutlet:
@property(weak,nonatomic)IBOutlet UIBarButtonItem *barButtonItem;
следующий в .m файле:
yourUIActivityViewController.popoverPresentationController.barButtonItem = self.barButtonItem;
источник
swift = ios7 / ios8
источник
Я нашел это решение. Во-первых, ваш контроллер представления, который представляет поповер, должен реализовывать
<UIPopoverPresentationControllerDelegate>
протокол.Далее вам нужно установить
popoverPresentationController
делегат.Добавьте эти функции:
источник
В swift 4 следующий код работает в iphone и ipad. По документации
источник
Я использую Swift 5. У меня была та же проблема сбоя при нажатии кнопки «Поделиться» в моем приложении на iPad. Нашел это решение. Шаг 1: Добавьте объект «просмотр» (поиск «UIView» в библиотеке объектов) в Main.storyboard. Шаг 2. Создайте @IBOutlet в ViewController.swift и назначьте любое имя (например, view1).
Шаг 3: добавьте указанное имя (например, view1) в качестве sourceView. это мое действие "Кнопка" Поделиться ".
Я очень новичок в Свифте и застрял на этой неделе. надеюсь, это поможет кому-то. так что делюсь этим решением.
источник
Для Swift 2.0. Я обнаружил, что это работает, если вы пытаетесь привязать поповер к кнопке «Поделиться» на iPad. Это предполагает, что вы создали выход для кнопки «Поделиться» на панели инструментов.
источник
Будьте осторожны, если вы разрабатываете для iPad с использованием swift, он будет хорошо работать при отладке, но в выпуске вылетит. Чтобы заставить его работать с testFlight и AppStore, отключите оптимизацию для swift, использующего
-none
для выпуска.источник