Saat ini saya sedang menguji aplikasi saya dengan Xcode 6 (Beta 6). UIActivityViewController berfungsi dengan baik dengan perangkat dan simulator iPhone tetapi macet dengan simulator dan perangkat iPad (iOS 8) dengan log berikut
Terminating app due to uncaught exception 'NSGenericException',
reason: 'UIPopoverPresentationController
(<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>)
should have a non-nil sourceView or barButtonItem set before the presentation occurs.
Saya menggunakan kode berikut untuk iPhone dan iPad untuk iOS 7 dan juga 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];
Saya juga mengalami crash yang sama pada salah satu aplikasi saya yang lain. Bisakah Anda membimbing saya? apakah ada yang berubah dengan UIActivityViewController di iOS 8? Saya memeriksa tetapi saya tidak menemukan apa pun dalam hal ini
ios
objective-c
ios8
uiactivityviewcontroller
Bhumit Mehta
sumber
sumber
Jawaban:
Di iPad, pengontrol tampilan aktivitas akan ditampilkan sebagai popover menggunakan UIPopoverPresentationController baru , ia mengharuskan Anda menentukan titik jangkar untuk presentasi popover menggunakan salah satu dari tiga properti berikut:
Untuk menentukan titik jangkar, Anda harus mendapatkan referensi ke UIPopoverPresentationController UIActivityController's dan mengatur salah satu properti sebagai berikut:
sumber
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
Masalah yang sama datang ke proyek saya maka saya menemukan solusi untuk membuka
UIActivityViewController
iPad yang harus kita gunakanUIPopoverController
Berikut adalah kode untuk menggunakannya di iPhone dan iPad:
Untuk swift 4.2 / swift 5
sumber
Saya menemukan masalah yang tepat baru-baru ini (pertanyaan asli) di Swift 2.0, di mana
UIActivityViewController
bekerja dengan baik untuk iPhone, tetapi menyebabkan crash ketika mensimulasikan iPads.Saya hanya ingin menambahkan utas jawaban ini di sini bahwa, setidaknya di Swift 2.0, Anda tidak perlu pernyataan if. Anda bisa membuatnya
popoverPresentationController
opsional.Di samping itu, jawaban yang diterima tampaknya mengatakan bahwa Anda bisa saja memiliki sourceView, hanya sourceRect, atau barButtonItem, tetapi menurut dokumentasi Apple untuk UIPopoverPresentationController Anda memerlukan salah satu dari yang berikut:
Contoh khusus yang saya kerjakan adalah di bawah ini, di mana saya membuat fungsi yang mengambil
UIView
(untuk sourceView dan sourceRect) danString
(satu-satunya activityItem item UIActivityViewController).Kode ini berfungsi di iPhone dan iPad (dan bahkan TVOS saya pikir) - jika perangkat tidak mendukung
popoverPresentationController
, dua baris kode yang menyebutkannya pada dasarnya diabaikan.Agak baik bahwa semua yang perlu Anda lakukan untuk membuatnya berfungsi untuk iPad hanya menambahkan dua baris kode, atau hanya satu jika Anda menggunakan barButtonItem!
sumber
respondsToSelector
atauUIUserInterfaceIdiom
, juga tampaknya cocok dengan Swift sebagai bahasa yang jauh lebih baik. MeskipunrespondsToSelector
sepertinya itu diperlukan untuk iOS7, jika menggunakan versi iOS yang lebih baru, ini sepertinya merupakan cara yang harus dilakukan.Saya melihat banyak orang meng-hardcoding iPhone / iPad dll. Saat menggunakan kode Swift.
Ini tidak diperlukan, Anda harus menggunakan fitur bahasa. Kode berikut mengasumsikan Anda akan menggunakan UIBarButtonItem dan akan bekerja pada kedua iPhone dan iPad.
Perhatikan bagaimana tidak ada pernyataan If atau hal gila lainnya. Bungkusan opsional akan nol pada iPhone, sehingga saluran
vc.popoverPresentationController?
tidak akan melakukan apa pun pada iPhone.sumber
vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
sebelum Anda menampilkan controller tampilan.shareTapped()
:vc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
keduanya masih macet. Apa yang saya lakukan salah? sementara saya di sini, bagaimana cara mengisi popover dengan berbagai layanan berbagi seperti Facebook, twitter, dll?sender
memang aUIBarButtonItem
. Pastikan vc tidaknil
. Periksa apakah Anda dapat menyajikan ViewController ... tanpa melihat crash / kode yang sulit diketahui. Layanan akan secara otomatis terisi jika pengguna menginstal aplikasi (kecuali Anda secara eksplisit memutuskan untuk mengecualikan beberapa).Solusi menggunakan Xamarin.iOS.
Dalam contoh saya, saya melakukan tangkapan layar, menghasilkan gambar, dan memungkinkan pengguna untuk berbagi gambar. Munculan di iPad diletakkan di tengah layar.
sumber
Swift, iOS 9/10 (setelah UIPopoverController tidak digunakan lagi)
sumber
Di Swift untuk memperbaiki ini untuk iPad, cara terbaik adalah melakukan seperti ini yang saya temukan.
sumber
Jika Anda menunjukkan
UIActivityViewController
ketika Anda mengklikUIBarButtonItem
gunakan kode berikut:Jika tidak, jika Anda menggunakan kontrol lain, misalnya a
UIButton
, gunakan kode berikut:Dari dokumentasi ke
UIPopoverPresentationController
:sumber
Perbaiki untuk Swift 2.0
sumber
Swift 3:
sumber
Cepat:
sumber
Solusi untuk Objective-C dan dengan menggunakan UIPopoverPresentationController
sumber
Saya mencoba kode berikutnya dan berfungsi:
pertama-tama letakkan item tombol bilah di View Controller Anda lalu buat IBOutlet:
@property(weak,nonatomic)IBOutlet UIBarButtonItem *barButtonItem;
selanjutnya dalam file .m:
yourUIActivityViewController.popoverPresentationController.barButtonItem = self.barButtonItem;
sumber
swift = ios7 / ios8
sumber
Saya menemukan solusi ini Pertama, view controller Anda yang menyajikan popover harus mengimplementasikan
<UIPopoverPresentationControllerDelegate>
protokol.Selanjutnya, Anda harus mengatur
popoverPresentationController
delegasi.Tambahkan fungsi-fungsi ini:
sumber
Dalam cepat 4 kode berikut berfungsi di iphone dan ipad. Dokumentasi menurut
sumber
Saya menggunakan Swift 5. Saya memiliki masalah mogok yang sama ketika saya mengklik "tombol Bagikan" di aplikasi saya di iPad. Menemukan solusi ini. langkah 1: Tambahkan objek "lihat" (cari "UIView" di perpustakaan objek) ke Main.storyboard. langkah 2: Buat @IBOutlet di ViewController.swift dan tetapkan nama apa pun (misalnya: view1)
langkah 3: tambahkan nama di atas (misalnya: view1) sebagai sourceView. ini adalah tindakan "tombol Bagikan" saya.
Saya sangat baru untuk cepat dan terjebak dalam hal ini selama seminggu. Semoga ini bisa membantu seseorang. jadi bagikan solusi ini.
sumber
Untuk Swift 2.0. Saya menemukan bahwa ini berfungsi jika Anda mencoba untuk melabuhkan popover ke tombol share di iPad. Ini mengasumsikan bahwa Anda telah membuat outlet untuk tombol bagikan di bilah alat Anda.
sumber
Hati-hati jika Anda mengembangkan untuk iPad menggunakan swift, ini akan berfungsi dengan baik dalam debug, tetapi akan macet saat dirilis. Untuk membuatnya bekerja dengan testFlight dan AppStore, nonaktifkan optimasi untuk penggunaan cepat
-none
untuk rilis.sumber