Atualmente, estou testando meu aplicativo com o Xcode 6 (Beta 6). O UIActivityViewController funciona bem com dispositivos e simuladores do iPhone, mas falha com simuladores e dispositivos do iPad (iOS 8) com os seguintes registros
Terminating app due to uncaught exception 'NSGenericException',
reason: 'UIPopoverPresentationController
(<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>)
should have a non-nil sourceView or barButtonItem set before the presentation occurs.
Estou usando o seguinte código para iPhone e iPad para iOS 7 e 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];
Estou tendo uma falha semelhante em um outro meu aplicativo também. Você pode me guiar, por favor ? alguma coisa mudou com o UIActivityViewController no iOS 8? Eu verifiquei, mas não encontrei nada sobre isso
ios
objective-c
ios8
uiactivityviewcontroller
Bhumit Mehta
fonte
fonte
Respostas:
No iPad, o controlador de exibição de atividade será exibido como um popover usando o novo UIPopoverPresentationController , requer que você especifique um ponto de ancoragem para a apresentação do popover usando uma das três propriedades a seguir:
Para especificar o ponto de ancoragem, você precisará obter uma referência ao UIPopoverPresentationController do UIActivityController e definir uma das propriedades da seguinte maneira:
fonte
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
Mesmo problema chegou ao meu projeto, então eu encontrei a solução que para abrir o
UIActivityViewController
iPad nós temos que usarUIPopoverController
Aqui está um código para usá-lo no iPhone e no iPad:
Para velozes 4.2 / velozes 5
fonte
Eu estava encontrando esse problema exato recentemente (a pergunta original) no Swift 2.0, onde
UIActivityViewController
funcionou bem para iPhones, mas causou falhas ao simular iPads.Eu só quero adicionar a este tópico de respostas aqui que, pelo menos no Swift 2.0, você não precisa de uma declaração if. Você pode apenas fazer o
popoverPresentationController
opcional.Em resumo, a resposta aceita parece estar dizendo que você poderia ter apenas um sourceView, apenas um sourceRect ou apenas um barButtonItem, mas de acordo com a documentação da Apple para UIPopoverPresentationController, você precisa de um dos seguintes:
O exemplo específico em que eu estava trabalhando está abaixo, onde estou criando uma função que
UIView
utiliza um (para o sourceView e sourceRect) eString
(o único activityItem do UIActivityViewController).Esse código funciona no iPhone e iPad (e até no tvOS, eu acho) - se o dispositivo não suportar
popoverPresentationController
, as duas linhas de código que o mencionam serão essencialmente ignoradas.Meio legal que tudo que você precisa fazer para que funcione para iPads é apenas adicionar duas linhas de código, ou apenas uma, se você estiver usando um barButtonItem!
fonte
respondsToSelector
ouUIUserInterfaceIdiom
também parece se encaixar muito melhor no Swift. EmborarespondsToSelector
pareça necessário para o iOS7, se estiver usando versões mais recentes do iOS, esse definitivamente parece ser o caminho.Eu vejo muitas pessoas codificando o iPhone / iPad etc. enquanto usam o código Swift.
Isso não é necessário, você deve usar os recursos de idioma. O código a seguir assume que você vai usar um UIBarButtonItem e irá funcionar em ambos iPhone e iPad.
Observe como não há declarações If ou qualquer outra coisa louca. O desembrulhar opcional será nulo no iPhone, portanto a linha
vc.popoverPresentationController?
não fará nada nos iPhones.fonte
vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
antes de apresentar o controlador de exibição.shareTapped()
:vc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
ambas ainda caíram. O que estou fazendo de errado? Enquanto estou aqui, como faço para preencher o popover com os diferentes serviços de compartilhamento, como Facebook, Twitter, etc.?sender
é realmente aUIBarButtonItem
. Verifique se vc não énil
. Verifique se você pode apresentar um ViewController ... sem olhar para a falha / código é difícil de dizer. Os serviços serão preenchidos automaticamente se o usuário tiver o aplicativo instalado (a menos que você decida explicitamente excluir alguns).Solução usando o Xamarin.iOS.
No meu exemplo, estou fazendo uma captura de tela, produzindo uma imagem e permitindo que o usuário compartilhe a imagem. O pop-up no iPad é colocado no meio da tela.
fonte
Swift, iOS 9/10 (após o UIPopoverController descontinuado)
fonte
No Swift para corrigir isso no iPad, a melhor maneira é fazer isso que eu encontrei.
fonte
Se você mostrar
UIActivityViewController
quando clicar em um,UIBarButtonItem
use o seguinte código:Caso contrário, se você usar outro controle, por exemplo
UIButton
, a , use o seguinte código:Da documentação ao
UIPopoverPresentationController
:fonte
Correção para Swift 2.0
fonte
Swift 3:
fonte
Rápido:
fonte
Solução para Objective-C e com o uso UIPopoverPresentationController
fonte
Eu tentei o próximo código e funciona:
primeiro, coloque um item de botão de barra no seu View Controller e crie um IBOutlet:
@property(weak,nonatomic)IBOutlet UIBarButtonItem *barButtonItem;
próximo no arquivo .m:
yourUIActivityViewController.popoverPresentationController.barButtonItem = self.barButtonItem;
fonte
swift = ios7 / ios8
fonte
Encontrei esta solução Em primeiro lugar, o seu controlador de exibição que está apresentando o popover deve implementar o
<UIPopoverPresentationControllerDelegate>
protocolo.Em seguida, você precisará definir o
popoverPresentationController
delegado.Adicione estas funções:
fonte
No swift 4 seguinte código trabalhando no iphone e ipad. De acordo com a documentação
fonte
Estou usando o Swift 5. Tive o mesmo problema de travar ao clicar em "botão Compartilhar" no meu aplicativo no iPad. Encontrei uma solução. etapa 1: adicione o objeto "view" (pesquise "UIView" na biblioteca de objetos) ao Main.storyboard. Etapa 2: Crie um @IBOutlet no ViewController.swift e atribua qualquer nome (por exemplo: view1)
Etapa 3: adicione o nome acima (por exemplo: view1) como o sourceView. esta é a minha ação "botão Compartilhar".
Eu sou muito novo no rápido e fiquei preso nisso por uma semana. espero que isso ajude alguém. então, compartilhando esta solução.
fonte
Para o Swift 2.0. Descobri que isso funciona se você estiver tentando ancorar o popover em um botão de compartilhamento no iPad. Isso pressupõe que você criou uma saída para o botão de compartilhamento na barra de ferramentas.
fonte
Tenha cuidado se você estiver desenvolvendo para o iPad usando o swift, ele funcionará bem na depuração, mas falhará no lançamento. Para fazê-lo funcionar com testFlight e AppStore, desative a otimização para uso rápido
-none
para liberação.fonte