Obecnie testuję swoją aplikację za pomocą Xcode 6 (Beta 6). UIActivityViewController działa dobrze z urządzeniami iPhone i symulatorami, ale zawiesza się z symulatorami i urządzeniami iPad (iOS 8) z następującymi dziennikami
Terminating app due to uncaught exception 'NSGenericException',
reason: 'UIPopoverPresentationController
(<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>)
should have a non-nil sourceView or barButtonItem set before the presentation occurs.
Używam następującego kodu dla iPhone'a i iPada zarówno dla iOS 7, jak i 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];
Mam podobną awarię jednej z moich innych aplikacji. Czy możesz mnie poprowadzić? czy coś się zmieniło w UIActivityViewController w iOS 8? Sprawdziłem, ale nie znalazłem nic na ten temat
ios
objective-c
ios8
uiactivityviewcontroller
Bhumit Mehta
źródło
źródło
Odpowiedzi:
Na iPadzie kontroler widoku aktywności będzie wyświetlany jako popover przy użyciu nowego UIPopoverPresentationController , wymaga podania punktu kotwiczenia dla prezentacji popover przy użyciu jednej z trzech następujących właściwości:
Aby określić punkt kontrolny, musisz uzyskać odwołanie do UIPopoverPresentationController UIActivityController i ustawić jedną z właściwości w następujący sposób:
źródło
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
Ten sam problem pojawia się w moim projekcie, a potem znalazłem rozwiązanie, które trzeba otworzyć
UIActivityViewController
w iPadzieUIPopoverController
Oto kod do użycia zarówno na iPhonie, jak i iPadzie:
Dla szybkich 4.2 / szybkich 5
źródło
Dokładnie ten problem miałam ostatnio (pierwotne pytanie) w Swift 2.0, gdzie
UIActivityViewController
działał dobrze dla iPhone'ów, ale powodował awarie podczas symulacji iPadów.Chcę tylko dodać do tego wątku odpowiedzi, że przynajmniej w Swift 2.0 nie potrzebujesz instrukcji if. Możesz po prostu uczynić
popoverPresentationController
opcjonalnym.Krótko mówiąc, wydaje się, że zaakceptowana odpowiedź mówi, że możesz mieć tylko sourceView, po prostu sourceRect lub po prostu barButtonItem, ale zgodnie z dokumentacją Apple dla UIPopoverPresentationController potrzebujesz jednego z poniższych:
Konkretny przykład, nad którym pracowałem, znajduje się poniżej, w którym tworzę funkcję, która przyjmuje
UIView
(dla sourceView i sourceRect) iString
(jedyny element aktywności UIActivityViewController).Ten kod działa na iPhonie i iPadzie (a nawet tvOS) - jeśli urządzenie nie obsługuje
popoverPresentationController
, dwie linie kodu, które go wspominają, są zasadniczo ignorowane.Miło, że wszystko, co musisz zrobić, aby działało na iPady, to po prostu dodać dwa wiersze kodu lub jeden, jeśli używasz barButtonItem!
źródło
respondsToSelector
lubUIUserInterfaceIdiom
, również wydaje się pasować Swift jako język o wiele lepiej. ChociażrespondsToSelector
wydaje się, że jest to konieczne dla iOS7, jeśli używasz nowszych wersji iOS, zdecydowanie wydaje się to dobrym rozwiązaniem.Widzę wielu ludzi, którzy kodują iPhone'a / iPada itp. Podczas korzystania z kodu Swift.
Nie jest to konieczne, musisz użyć funkcji językowych. Poniższy kod zakłada, że użyjesz UIBarButtonItem i będzie działać zarówno na iPhonie, jak i iPadzie.
Zauważ, że nie ma żadnych instrukcji If ani żadnych innych szalonych rzeczy. Opcjonalne rozpakowywanie będzie zerowe na iPhonie, więc linia
vc.popoverPresentationController?
nie zrobi nic na iPhone'ach.źródło
vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
przed zaprezentowaniem kontrolera widoku.shareTapped()
: wvc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
obu nadal się zawiesiło. Co ja robię źle? gdy tu jestem, jak zapełnić popover różnymi usługami udostępniania, takimi jak Facebook, Twitter itp.?sender
to rzeczywiścieUIBarButtonItem
. Sprawdź, czy vc nie jestnil
. Sprawdź, czy możesz przedstawić ViewController… bez patrzenia na awarię / kod jest trudny do ustalenia. Usługi zostaną automatycznie wypełnione, jeśli użytkownik zainstaluje aplikację (chyba że wyraźnie postanowiłeś wykluczyć niektóre).Rozwiązanie za pomocą Xamarin.iOS.
W moim przykładzie robię zrzut ekranu, tworzę obraz i pozwalam użytkownikowi go udostępnić. Wyskakujące okienko na iPadzie znajduje się mniej więcej na środku ekranu.
źródło
Swift, iOS 9/10 (po przestarzałym UIPopoverController)
źródło
W Swift, aby to naprawić na iPadzie, najlepszym sposobem jest zrobienie tego w taki sposób, jaki znalazłem.
źródło
Jeśli wyświetlasz się
UIActivityViewController
po kliknięciu,UIBarButtonItem
użyj następującego kodu:W przeciwnym razie, jeśli użyjesz innej kontrolki, na przykład a
UIButton
, użyj następującego kodu:Od dokumentacji do
UIPopoverPresentationController
:źródło
Poprawka dla Swift 2.0
źródło
Swift 3:
źródło
Szybki:
źródło
Rozwiązanie dla Objective-C i przy użyciu UIPopoverPresentationController
źródło
Wypróbowałem następny kod i działa:
najpierw umieść element przycisku paska w kontrolerze widoku, a następnie utwórz IBOutlet:
@property(weak,nonatomic)IBOutlet UIBarButtonItem *barButtonItem;
dalej w pliku .m:
yourUIActivityViewController.popoverPresentationController.barButtonItem = self.barButtonItem;
źródło
swift = ios7 / ios8
źródło
Znalazłem to rozwiązanie Po pierwsze, twój kontroler widoku, który prezentuje popover, powinien zaimplementować
<UIPopoverPresentationControllerDelegate>
protokół.Następnie musisz ustawić
popoverPresentationController
delegata.Dodaj te funkcje:
źródło
W szybkim 4 następujący kod działa na iPhonie i iPadzie. Zgodnie z dokumentacją
źródło
Używam Swift 5. Miałem ten sam problem z awarią, kiedy kliknąłem przycisk „Udostępnij” w mojej aplikacji na iPadzie. Znalazłem to rozwiązanie. krok 1: Dodaj obiekt „widok” (wyszukaj „UIView” w bibliotece obiektów) do Main.storyboard. krok 2: Utwórz @IBOutlet w ViewController.swift i przypisz dowolną nazwę (np .: view1)
krok 3: dodaj powyższą nazwę (np .: view1) jako sourceView. to jest moja akcja „Udostępnij przycisk”.
Jestem bardzo nowy w swift i utknąłem w tym na tydzień. mam nadzieję, że to komuś pomoże. więc dzieląc się tym rozwiązaniem.
źródło
Dla Swift 2.0. Przekonałem się, że działa to, jeśli próbujesz zakotwiczyć popovera do przycisku udostępniania na iPadzie. Zakłada się, że utworzono ujście dla przycisku udostępniania na pasku narzędzi.
źródło
Zachowaj ostrożność, jeśli programujesz dla iPada za pomocą szybkiego, będzie działał dobrze podczas debugowania, ale zawiesi się w wersji. Aby działał z testFlight i AppStore, wyłącz optymalizację dla szybkiego użycia
-none
przy wydaniu.źródło