UIActionSheet iptal düğmesi garip davranışı


116

Kullanıcılara ne yapacakları hakkında seçenekler sunmak için bir eylem sayfası açan bir UIBarButtonItem var. "İptal" düğmesini tıklamayı denemediğim sürece her şey beklendiği gibi çalışıyor. Düğmenin hedefi olması gereken yerden yukarı çıkmış görünüyor. Yalnızca "İptal" ve "Tamam" düğmelerinin ortasında bir yere tıklayarak etkinleştirebilirim.

Diğer uygulamalarda işlem sayfalarını denedim ve iyi çalışıyorlar, bu yüzden bu sadece benim büyük parmağım değil. Eylem sayfası bir UIViewController'da açılıyor

- (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];
}

5
İlgisiz bir not olarak, WWDC'de bir Apple UI gözden geçirme oturumu sırasında Eylem Sayfalarındaki kırmızı düğmenin gerçekten 'yıkıcı' eylemler (yani 'silme') için tasarlandığı söylendi.
Ramin

Evet, son zamanlarda insan arayüzü kurallarını okudum ve bunu gördüm. Kırmızıdan griye değiştirdi.
nevan king

Yanıtlar:


190

Mevcut görünüm denetleyicisinin görünümünü işlem sayfasına geçirmek yerine, showFromTabBar:yöntemini kullanın UIActionSheet.

Doğru Yol
Bu, doğru dokunulabilir alanı verecektir:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

Yanlış Yol
Bu, dokunulabilir alanı yanlış yere koyacaktır (bir sekme çubuğu veya araç çubuğu kullanıyorsanız):

[actionSheet showInView:self.view];

Bir araç çubuğu kullanıyorsanız, showFromToolbar:bunun yerine yöntemi kullanın. Araç çubuğuna, büyük olasılıkla bir ivar referansına ihtiyacınız olacak

[actionSheet showFromToolbar:self.myToolbar];

My Old Answer da işe yarıyor, ancak hilekar:

Olası bir cevap buldum:

01-Ara-2008 10:22 PM Tom Saxton: Bu hataya biraz daha baktım ve tabbar ile ilgili bir sorun gibi görünüyor.

UIActionSheet'in [sheet showInView: self.view] öğesini bir UITabViewController'ın alt öğesi olan bir görünüm denetleyicisinden çağırırsanız, iptal düğmesindeki tıklama testi UIActionSheet'in tab çubuğunun görünümünün üzerinde bulunan bölümünde başarısız olur.

Bunun yerine UITabBarController'ın görünümüne geçerseniz, UIActionSheet beklendiği gibi davranır.

NOT: iPhone OS 2.1 ve önceki sürümlerde, UIActionSheet alt görünümden geçtiğinizde sekme çubuğunun üstünden geldi, ancak 2.2'de sekme çubuğunun altından gelir ve böylece sekme görünümünü kaplar.

http://openradar.appspot.com/6410780

Düzenleme: Görünümü sekme çubuğunun görünümü olacak şekilde değiştirdiğimde düzgün çalışıyor

[sheet showInView:self.parentViewController.tabBarController.view];

İşe yaradığı için buna olumlu oy verdi. Bu neden diğer cevaplardan daha iyi?
bentford

1
Neden parentViewController? Görünüm bir gezinme görünümü sekmesinde olsa bile BarController yine de doğru yere işaret etmelidir. Benim için her durumda parentViewController olmadan çalışır.
Nathan

11
Başka bir cevap potansiyel olarak daha iyi görünüyor. [ActionSheet showInView: [self.view penceresi]] 'ni arayın. Daha basit ve daha genel görünüyor.
Kevin

Bu cevabı gönderdiğiniz için çok teşekkür ederim.
fulvio

1
Uygulamamda sekme çubuğum yok, ancak hala böyle bir sorun var. Bunu '[serf.view window]' ile çözdüm. Zaten sekme çubuğu problemi değil.
Mike Keskinov

37

Burada işe yarayan bir cevap buldum .

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

Sekme çubuğuma ulaşmak için birkaç yol denedim ve bu uygulamanın kurulma şekli kıvrımlı görünüyor ...


MÜKEMMEL! Teşekkürler. Bu benim için doğru çözüm, çünkü bu sorunu burada diğerleri gibi bir TabBar olmayan bir araç çubuğuna sahip bir UITableViewController ile yaşıyordum .
William Denniss

iyi şeyler, bu benim için çalıştı! bu kesinlikle bunu yapmanın en kolay yolu!
cgossain

2
Başka bir soruna neden olur. ActionSheet, cihaz yatay konumdayken (ve diğer tüm içerikler) dikey yönde görünür.
Mike Keskinov

22

Bunun yerine şunu kullanın:

[sheet showFromTabBar:theTabBar];

1
Bunu dan showInTabBar:olarak düzelttim showFromTabBar:. Ayrıca, ekranın altında hangi ekran mobilyasına sahip olduğunuza bağlı olarak bir 'showFromToolbar:' yöntemi olduğunu unutmayın. Bence bu, kabul edilen cevaptan daha iyi bir cevap.
Stephen Darlington

Stephen, neden bunun showInView: theTabBar'ı belirlemekten daha iyi olduğunu düşündüğünü merak ediyor musun? Birleştirme perspektifinden, daha sonra tabBar'ın düşmesi, örneğin bir araç çubuğuyla değiştirilmesi durumunda showInView'in muhtemelen daha ideal olacağını düşünürdüm. Belirli bir alt görünüm denetleyicisinin gerçekten bilmesi veya umursaması gerekmemesi gerektiğini düşünüyorum.
Billy Gray

Sekme çubuğu daha sonra bırakılırsa, bu kod satırını ne olursa olsun düzenlemeniz gerekecektir (TabBar, geçirilen bir görünüme kötü adlandırılmış bir referans değilse). Bu yüzden bu yöntemin showInView: theTabBar'dan daha fazla nasıl birleştirildiğini görmüyorum. ShowFromTabBar'ı kullanıyorum: benim için daha güvenli göründüğü gibi. Kapakların altında neler olduğunu bilmiyorum, ancak showFromTabBar'ın gelecekteki işletim sistemi sürümlerinde bozulma olasılığı showFromView'a göre daha düşük: sekme çubuğu görünümüyle.
Christopher Pickslay

10

İşte düzeltme. Şunu deneyin:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];

5

Bence üç cevabın bir kombinasyonu bunun üstesinden gelmenin doğru yolu:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

yani, showFromTabBar'ı kullanın (bu yüzden var) ve Nathan'ın da belirttiği gibi parentViewController'a ihtiyacınız yok (aslında self.parentViewController.tabBarController.tabBar benim için nil döndürüyor.


Elbette nil döndürür, çünkü üst görünüm denetleyicisi (UITabBarViewController'dir) kendisini başka bir UITabBarController'a yerleştirmediğinden tabBarController özelliği sıfırdır.
Dominik Seibold

1

Bilginize - UIDocumentInteractionController'ın eylem sayfasının sekme çubuğuna adım atmasıyla aynı sorunu yaşadı. Düzeltmek için aşağıdakileri kullandı.

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

-2

basit kod yaz

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

bu iyi çalışıyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.