UIActivityViewController устанавливает sourceView в UIBarButtonItem

Для приложения iPhone/iPad у меня есть функция для совместного использования, когда кто-то нажимает на UIBarButtonItem.

UIActivityViewController * activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItems applicationActivities:nil];

    [self presentViewController:activityVC animated:YES completion:nil];

Для iPad, однако, это ошибки кода, потому что мне нужно установить sourceView для activityVC.

Поэтому мне нужно добавить этот код, но установите его в положение UIBarButtonItem.

activityVC.popoverPresentationController.sourceView = SomeUIBarButtonItem;

Но это не сработает, поскольку UIBarButtonItem не наследует UIView (что для меня действительно странно, и я не понимаю эту логику).

Есть ли способ установить его таким образом, чтобы отображался элемент share popover, указывающий на элемент панели?

Спасибо,

Ответ 1

Все, что вам нужно сделать, это использовать свойство popover barButtonItem.

Итак, правильный код для поддержки ActivityViewController или UIAlertController на iPad:

popover.barButtonItem = self.navigationItem.rightBarButtonItem;

Еще один пример полной поддержки iPad с UIAlertController (но точно так же работает с ActivityViewController):

UIPopoverPresentationController *popover = alert.popoverPresentationController;
if (popover)
{
    popover.barButtonItem = self.navigationItem.rightBarButtonItem;
    popover.permittedArrowDirections = UIPopoverArrowDirectionUp;
}

[self presentViewController:alert animated:YES completion:nil];

Swift 4.2

if let popover = alert.popoverPresentationController {
     popover.barButtonItem  = self.navigationItem.rightBarButtonItem
     popover.permittedArrowDirections = .up
}

self.present(alert, animated: true, completion: nil)