Ich teste derzeit meine App mit Xcode 6 (Beta 6). UIActivityViewController funktioniert gut mit iPhone-Geräten und -Simulatoren, stürzt jedoch mit iPad-Simulatoren und -Geräten (iOS 8) mit folgenden Protokollen ab
Terminating app due to uncaught exception 'NSGenericException',
reason: 'UIPopoverPresentationController
(<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>)
should have a non-nil sourceView or barButtonItem set before the presentation occurs.
Ich verwende den folgenden Code für iPhone und iPad sowohl für iOS 7 als auch für 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];
Ich bekomme einen ähnlichen Absturz in einer meiner anderen Apps. Kannst du mich bitte führen? Hat sich mit UIActivityViewController in iOS 8 etwas geändert? Ich habe nachgesehen, aber nichts gefunden
ios
objective-c
ios8
uiactivityviewcontroller
Bhumit Mehta
quelle
quelle
Antworten:
Auf dem iPad wird der Aktivitätsansichts-Controller mit dem neuen UIPopoverPresentationController als Popover angezeigt. Dazu müssen Sie einen Ankerpunkt für die Darstellung des Popovers mit einer der drei folgenden Eigenschaften angeben:
Um den Ankerpunkt anzugeben, müssen Sie einen Verweis auf den UIPopoverPresentationController des UIActivityController erhalten und eine der folgenden Eigenschaften festlegen:
quelle
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
Das gleiche Problem ist bei meinem Projekt aufgetreten, dann habe ich die Lösung gefunden, um das zu öffnen
UIActivityViewController
wir iPad verwenden müssenUIPopoverController
Hier ist ein Code für die Verwendung in iPhone und iPad:
Für schnelles 4.2 / schnelles 5
quelle
Ich habe kürzlich genau dieses Problem (die ursprüngliche Frage) in Swift 2.0 festgestellt, wo
UIActivityViewController
für iPhones gut funktionierte, aber bei der Simulation von iPads Abstürze verursachte.Ich möchte diesem Thread hier nur hinzufügen, dass Sie zumindest in Swift 2.0 keine if-Anweisung benötigen. Sie können einfach die machen
popoverPresentationController
optionale machen.Abgesehen davon scheint die akzeptierte Antwort zu lauten, dass Sie nur eine Quellansicht, nur eine Quellrektive oder nur ein barButtonItem haben könnten. Laut Apples Dokumentation für UIPopoverPresentationController benötigen Sie jedoch eine der folgenden Optionen :
Das spezielle Beispiel, an dem ich gearbeitet habe, ist unten, wo ich eine Funktion erstelle, die ein
UIView
(für sourceView und sourceRect) undString
(das einzige activityItem des UIActivityViewController) enthält.Dieser Code funktioniert auf iPhone und iPad (und sogar auf tvOS, glaube ich) - wenn das Gerät dies nicht unterstützt
popoverPresentationController
, werden die beiden Codezeilen, in denen es erwähnt wird, im Wesentlichen ignoriert.Ein bisschen schön, dass alles, was Sie tun müssen, damit es für iPads funktioniert, nur zwei Codezeilen hinzufügt, oder nur eine, wenn Sie ein barButtonItem verwenden!
quelle
respondsToSelector
oderUIUserInterfaceIdiom
sie scheint auch viel besser zu Swift als Sprache zu passen. ObwohlrespondsToSelector
dies für iOS7 notwendig erscheint, scheint dies bei Verwendung neuerer Versionen von iOS definitiv der richtige Weg zu sein.Ich sehe viele Leute, die iPhone / iPad usw. fest codieren, während sie Swift-Code verwenden.
Dies ist nicht erforderlich, Sie müssen die Sprachfunktionen verwenden. Der folgende Code setzt voraus, dass Sie ein UIBarButtonItem verwenden und sowohl auf dem iPhone als auch auf dem iPad funktionieren .
Beachten Sie, dass es keine If-Anweisungen oder andere verrückte Dinge gibt. Das optionale Auspacken ist auf dem iPhone gleich Null, sodass die Leitung
vc.popoverPresentationController?
auf iPhones nichts bewirkt.quelle
vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
bevor Sie den Ansichts-Controller präsentieren.shareTapped()
:vc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
beide stürzten immer noch ab. Was mache ich falsch? Wie fülle ich das Popover mit den verschiedenen Freigabediensten wie Facebook, Twitter usw. auf, während ich hier bin?sender
tatsächlich ein istUIBarButtonItem
. Überprüfen Sie, ob vc nicht istnil
. Überprüfen Sie, ob Sie einen ViewController präsentieren können ... ohne auf den Absturz / Code zu achten, ist schwer zu sagen. Die Dienste werden automatisch ausgefüllt, wenn der Benutzer die App installiert hat (es sei denn, Sie haben ausdrücklich beschlossen, einige auszuschließen).Lösung mit Xamarin.iOS.
In meinem Beispiel mache ich eine Bildschirmaufnahme, erstelle ein Bild und erlaube dem Benutzer, das Bild freizugeben. Das Popup auf dem iPad befindet sich ungefähr in der Mitte des Bildschirms.
quelle
Swift, iOS 9/10 (nachdem UIPopoverController veraltet ist)
quelle
In Swift, um dies für das iPad zu beheben, ist es am besten, dies so zu tun, wie ich es gefunden habe.
quelle
Wenn Sie
UIActivityViewController
beim Klicken auf einen anzeigen,UIBarButtonItem
verwenden Sie den folgenden Code:Wenn Sie andernfalls ein anderes Steuerelement verwenden, z. B. a
UIButton
, verwenden Sie den folgenden Code:Von der Dokumentation bis zum
UIPopoverPresentationController
:quelle
Fix für Swift 2.0
quelle
Swift 3:
quelle
Schnell:
quelle
Lösung für Objective-C und mit UIPopoverPresentationController
quelle
Ich habe den nächsten Code ausprobiert und es funktioniert:
Fügen Sie zuerst ein Balkenschaltflächenelement in Ihren View Controller ein und erstellen Sie dann ein IBOutlet:
@property(weak,nonatomic)IBOutlet UIBarButtonItem *barButtonItem;
Weiter in der .m-Datei:
yourUIActivityViewController.popoverPresentationController.barButtonItem = self.barButtonItem;
quelle
schnell = ios7 / ios8
quelle
Ich habe diese Lösung gefunden. Erstens sollte Ihr View Controller, der das Popover präsentiert, das implementieren
<UIPopoverPresentationControllerDelegate>
.Als nächstes müssen Sie die einstellen
popoverPresentationController
Delegaten des .Fügen Sie diese Funktionen hinzu:
quelle
In Swift 4 funktioniert der folgende Code in iPhone und iPad. Entsprechend Dokumentation
quelle
Ich benutze Swift 5. Ich hatte das gleiche Problem mit dem Absturz, als ich in meiner App auf dem iPad auf "Teilen" klickte. Fand eine dieser Lösung. Schritt 1: Fügen Sie dem Main.storyboard das Objekt "view" hinzu (suchen Sie in der Objektbibliothek nach "UIView"). Schritt 2: Erstellen Sie ein @IBOutlet in ViewController.swift und weisen Sie einen beliebigen Namen zu (z. B. view1).
Schritt 3: Fügen Sie den obigen Namen (z. B. view1) als Quellansicht hinzu. Dies ist meine Aktion "Teilen".
Ich bin sehr neu in Swift und war eine Woche lang dabei. hoffe, das wird jemandem helfen. Teilen Sie diese Lösung.
quelle
Für Swift 2.0. Ich habe festgestellt, dass dies funktioniert, wenn Sie versuchen, das Popover an einer Freigabeschaltfläche auf dem iPad zu verankern. Dies setzt voraus, dass Sie in Ihrer Symbolleiste einen Ausgang für die Freigabeschaltfläche erstellt haben.
quelle
Seien Sie vorsichtig, wenn Sie mit swift für das iPad entwickeln. Es funktioniert beim Debuggen einwandfrei, stürzt jedoch beim Release ab. Deaktivieren Sie die Optimierung für die schnelle Verwendung
-none
für die Freigabe , damit sie mit testFlight und AppStore funktioniert .quelle