Je teste actuellement mon application avec Xcode 6 (Beta 6). UIActivityViewController fonctionne correctement avec les appareils et simulateurs iPhone mais se bloque avec les simulateurs et appareils iPad (iOS 8) avec les journaux suivants
Terminating app due to uncaught exception 'NSGenericException',
reason: 'UIPopoverPresentationController
(<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>)
should have a non-nil sourceView or barButtonItem set before the presentation occurs.
J'utilise le code suivant pour iPhone et iPad pour iOS 7 ainsi que 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];
Je reçois également un crash similaire dans l'une de mes autres applications. Pouvez-vous me guider s'il vous plaît? est-ce que quelque chose a changé avec UIActivityViewController dans iOS 8? J'ai vérifié mais je n'ai rien trouvé à ce sujet
ios
objective-c
ios8
uiactivityviewcontroller
Bhumit Mehta
la source
la source
Réponses:
Sur iPad, le contrôleur de vue d'activité sera affiché en tant que popover en utilisant le nouveau UIPopoverPresentationController , il nécessite que vous spécifiez un point d'ancrage pour la présentation du popover en utilisant l'une des trois propriétés suivantes:
Afin de spécifier le point d'ancrage, vous devrez obtenir une référence à l'UIPopoverPresentationController de UIActivityController et définir l'une des propriétés comme suit:
la source
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
Le même problème est arrivé à mon projet, j'ai trouvé la solution pour ouvrir l'
UIActivityViewController
iPad que nous devons utiliserUIPopoverController
Voici un code pour l'utiliser à la fois sur iPhone et iPad:
Pour swift 4.2 / swift 5
la source
Je rencontrais ce problème exact récemment (la question d'origine) dans Swift 2.0, où cela
UIActivityViewController
fonctionnait bien pour les iPhones, mais provoquait des plantages lors de la simulation des iPads.Je veux juste ajouter à ce fil de réponses ici que, au moins dans Swift 2.0, vous n'avez pas besoin d'une instruction if. Vous pouvez simplement faire l'
popoverPresentationController
option.En bref, la réponse acceptée semble dire que vous pourriez avoir juste une sourceView, juste un sourceRect ou simplement un barButtonItem, mais selon la documentation d' Apple pour UIPopoverPresentationController, vous avez besoin de l'un des éléments suivants:
L'exemple particulier sur lequel je travaillais est ci-dessous, où je crée une fonction qui prend un
UIView
(pour le sourceView et sourceRect) etString
(le seul activityItem de UIActivityViewController).Ce code fonctionne sur iPhone et iPad (et même tvOS je pense) - si l'appareil ne prend pas en charge
popoverPresentationController
, les deux lignes de code qui le mentionnent sont essentiellement ignorées.Un peu sympa que tout ce que vous devez faire pour que cela fonctionne pour les iPad est d'ajouter simplement deux lignes de code, ou une seule si vous utilisez un barButtonItem!
la source
respondsToSelector
ouUIUserInterfaceIdiom
, elle semble également mieux convenir à Swift en tant que langue. Bien que celarespondsToSelector
semble nécessaire pour iOS7, si vous utilisez des versions plus récentes d'iOS, cela semble définitivement être la voie à suivre.Je vois beaucoup de gens coder en dur l'iPhone / iPad, etc. lors de l'utilisation du code Swift.
Ce n'est pas nécessaire, vous devez utiliser les fonctionnalités linguistiques. Le code suivant suppose que vous utiliserez un UIBarButtonItem et travaillerez sur les deux iPhone et iPad.
Remarquez qu'il n'y a pas d'instructions If ou toute autre chose folle. Le déballage en option sera nul sur iPhone, donc la ligne
vc.popoverPresentationController?
ne fera rien sur les iPhones.la source
vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
avant de présenter le contrôleur de vue.shareTapped()
: lesvc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
deux se sont toujours écrasés. Qu'est-ce que je fais mal? pendant que je suis ici, comment puis-je remplir le popover avec les différents services de partage tels que Facebook, twitter, etc.?sender
s'agit bien d'unUIBarButtonItem
. Vérifiez que vc ne l'est pasnil
. Vérifiez que vous pouvez présenter un ViewController… sans regarder le plantage / le code est difficile à dire. Les services seront automatiquement renseignés si l'utilisateur a installé l'application (sauf si vous avez explicitement décidé d'en exclure certains).Solution utilisant Xamarin.iOS.
Dans mon exemple, je fais une capture d'écran, produisant une image et permettant à l'utilisateur de partager l'image. La fenêtre contextuelle sur l'iPad est placée au milieu de l'écran.
la source
Swift, iOS 9/10 (après UIPopoverController obsolète)
la source
Dans Swift pour résoudre ce problème sur iPad, le meilleur moyen est de faire comme cela que j'ai trouvé.
la source
Si vous affichez
UIActivityViewController
lorsque vous cliquez sur un,UIBarButtonItem
utilisez le code suivant:Sinon, si vous utilisez un autre contrôle, par exemple un
UIButton
, utilisez le code suivant:De la documentation au
UIPopoverPresentationController
:la source
Correctif pour Swift 2.0
la source
Swift 3:
la source
Rapide:
la source
Solution pour Objective-C et avec utilisation UIPopoverPresentationController
la source
J'ai essayé le code suivant et ça marche:
placez d'abord un élément de bouton de barre dans votre View Controller puis créez un IBOutlet:
@property(weak,nonatomic)IBOutlet UIBarButtonItem *barButtonItem;
suivant dans le fichier .m:
yourUIActivityViewController.popoverPresentationController.barButtonItem = self.barButtonItem;
la source
rapide = ios7 / ios8
la source
J'ai trouvé cette solution Premièrement, votre contrôleur de vue qui présente le popover devrait implémenter le
<UIPopoverPresentationControllerDelegate>
protocole.Ensuite, vous devrez définir le
popoverPresentationController
délégué de.Ajoutez ces fonctions:
la source
Dans swift 4, le code suivant fonctionne sur iPhone et iPad. Selon la documentation
la source
J'utilise Swift 5. J'ai eu le même problème de plantage lorsque je clique sur le "bouton Partager" dans mon application sur iPad. J'ai trouvé cette solution. étape 1: Ajoutez l'objet "view" (recherchez "UIView" dans la bibliothèque d'objets) au Main.storyboard. étape 2: créer un @IBOutlet dans ViewController.swift et attribuer un nom (par exemple: view1)
étape 3: ajoutez le nom ci-dessus (par exemple: view1) comme sourceView. c'est mon action "bouton Partager".
Je suis très nouveau pour swift et je suis resté coincé là-dessus pendant une semaine. J'espère que cela aidera quelqu'un. afin de partager cette solution.
la source
Pour Swift 2.0. J'ai trouvé que cela fonctionne si vous essayez d'ancrer le popover à un bouton de partage sur iPad. Cela suppose que vous avez créé une sortie pour le bouton de partage dans votre barre d'outils.
la source
Soyez prudent si vous développez pour iPad en utilisant swift, cela fonctionnera bien dans le débogage, mais plantera lors de la sortie. Afin de le faire fonctionner avec testFlight et AppStore, désactivez l'optimisation pour swift en utilisant
-none
pour la version.la source