UIActionSheet tombol batal perilaku aneh

116

Saya memiliki UIBarButtonItem yang membuka lembar tindakan untuk menawarkan pilihan kepada pengguna tentang apa yang harus dilakukan. Semuanya bekerja seperti yang diharapkan kecuali saya mencoba mengklik tombol "Batal". Target tombol tampaknya telah bergerak ke atas dari tempat seharusnya. Saya hanya dapat mengaktifkannya dengan mengklik di suatu tempat di tengah tombol "Batal" dan "Oke".

Saya telah mencoba di lembar tindakan di aplikasi lain dan berfungsi dengan baik, jadi bukan hanya ibu jari saya yang besar. Lembar tindakan dibuka di UIViewController

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
    initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
    delegate:self
    cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
    destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
    otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}
raja nevan
sumber
5
Pada catatan yang tidak terkait, saya diberitahu di WWDC selama sesi review UI Apple bahwa tombol merah di Lembar Tindakan benar-benar dimaksudkan untuk tindakan 'merusak' (yaitu 'menghapus').
Ramin
Ya, saya membaca pedoman antarmuka manusia baru-baru ini dan melihatnya. Mengubahnya dari merah menjadi abu-abu.
raja nevan

Jawaban:

190

Alih-alih meneruskan tampilan pengontrol tampilan saat ini ke lembar tindakan, gunakan showFromTabBar:metode UIActionSheet.

Cara yang Benar
Ini akan memberikan area yang dapat disadap dengan benar:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

Cara Yang Salah
Ini akan menempatkan area yang dapat disentuh di tempat yang salah (jika Anda menggunakan bilah tab atau bilah alat):

[actionSheet showInView:self.view];

Jika Anda menggunakan toolbar , gunakan showFromToolbar:metode sebagai gantinya. Anda memerlukan referensi ke toolbar, kemungkinan besar ivar

[actionSheet showFromToolbar:self.myToolbar];

My Old Answer Juga berfungsi, tetapi hacky:

Baru saja menemukan jawaban yang mungkin:

01-Des-2008 22:22 Tom Saxton: Saya melihat bug ini lagi, dan tampaknya ada masalah dengan tabbar.

Jika Anda memanggil [sheet showInView: self.view] UIActionSheet dari pengontrol tampilan yang merupakan turunan dari UITabViewController, maka pengujian klik pada tombol batal gagal di bagian UIActionSheet yang terletak di atas tampilan tabbar.

Jika Anda meneruskan dalam tampilan UITabBarController, UIActionSheet akan bertindak seperti yang diharapkan.

CATATAN: di iPhone OS 2.1 dan yang lebih lama, UIActionSheet muncul dari atas bilah tab saat Anda melewati tampilan anak, tetapi di 2.2, muncul dari bagian bawah bilah tab, dan dengan demikian menutupi tampilan tab.

http://openradar.appspot.com/6410780

Sunting: Ini bekerja dengan benar ketika saya mengubah tampilan menjadi tampilan tab bar

[sheet showInView:self.parentViewController.tabBarController.view];
raja nevan
sumber
Beri suara positif karena berhasil. Mengapa ini lebih baik dari jawaban lainnya?
bentford
1
Mengapa parentViewController? Meskipun tampilan dalam tampilan navigasi, tabBarController harus tetap mengarah ke tempat yang tepat. Berfungsi untuk saya tanpa parentViewController dalam hal apa pun.
Nathan
11
Jawaban lain tampaknya berpotensi lebih baik. Cari [actionSheet showInView: [self.view window]]. Tampak lebih lurus ke depan dan lebih umum.
Kevin
Terima kasih banyak telah memposting jawaban ini.
fulvio
1
Saya tidak memiliki bilah tab di aplikasi saya, tetapi masih memiliki masalah seperti itu. Saya menyelesaikannya dengan '[serf.view window]'. Ini bukan masalah tab bar.
Mike Keskinov
37

Saya menemukan jawaban di sini yang berhasil.

menggunakan: [filterActionSheet showInView:[self.view window]] :;

saya mencoba beberapa cara untuk sampai ke bilah tab saya dan cara mereka mengatur aplikasi ini tampaknya berbelit-belit ...

driveguy
sumber
SEMPURNA! Terima kasih. Ini adalah solusi yang tepat untuk saya, karena saya mengalami masalah ini dengan UITableViewController yang memiliki toolbar bukan TabBar seperti yang lain di sini.
William Denniss
barang bagus, ini berhasil untuk saya! ini jelas merupakan cara termudah untuk melakukannya!
cgossain
2
Ini menyebabkan masalah lain. ActionSheet muncul dalam orientasi potret saat perangkat dalam lanskap (serta semua konten lainnya).
Mike Keskinov
22

Sebagai gantinya gunakan:

[sheet showFromTabBar:theTabBar];
Corey Floyd
sumber
1
Saya mengoreksi ini dari showInTabBar:menjadi showFromTabBar:. Perhatikan juga bahwa terdapat metode 'showFromToolbar: `, bergantung pada furnitur layar yang Anda miliki di bagian bawah layar. Ini, menurut saya, adalah jawaban yang lebih baik daripada jawaban yang diterima.
Stephen Darlington
Stephen, penasaran mengapa menurut Anda ini lebih baik daripada menentukan showInView: theTabBar? Dari perspektif penggandengan, saya pikir showInView mungkin akan lebih ideal, jika nanti tabBar dijatuhkan, mungkin diganti dengan toolbar, misalnya. Pengontrol tampilan sub tertentu seharusnya tidak benar-benar harus tahu atau peduli, saya pikir.
Billy Gray
Jika bilah tab dijatuhkan nanti, Anda harus mengedit baris kode itu apa pun (kecuali mungkin tabBar adalah referensi yang dinamai buruk ke tampilan yang diteruskan). Jadi saya tidak melihat bagaimana metode ini lebih digabungkan dari showInView: theTabBar. Saya menggunakan showFromTabBar: juga, karena tampaknya lebih aman bagi saya. Saya tidak tahu apa yang terjadi di balik sampul, tetapi saya membayangkan bahwa showFromTabBar: kecil kemungkinannya untuk rusak dalam rilis OS di masa mendatang daripada showFromView: dengan tampilan bilah tab.
Christopher Pickslay
10

Berikut cara memperbaikinya. Coba ini:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];
Viggnesh
sumber
5

Saya pikir kombinasi dari tiga jawaban adalah cara yang tepat untuk menangani ini:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

yaitu, gunakan showFromTabBar (itulah mengapa ada) dan Anda tidak memerlukan parentViewController seperti yang ditunjukkan Nathan (sebenarnya, self.parentViewController.tabBarController.tabBar mengembalikan nol untuk saya.

RawMean
sumber
Tentu saja ia mengembalikan nil, karena pengontrol tampilan induk (yaitu UITabBarViewController) tidak bertumpuk sendiri ke dalam UITabBarController lain, jadi properti tabBarController-nya adalah nil.
Dominik Seibold
1

FYI - memiliki masalah yang sama dengan lembar tindakan UIDocumentInteractionController yang menginjak bilah tab. Gunakan yang berikut ini untuk memperbaikinya.

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];
Mickey
sumber
-2

tulis kode sederhana

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

ini bekerja dengan baik

jayesh kavathiya
sumber