ปุ่มยกเลิก UIActionSheet พฤติกรรมแปลก ๆ


116

ฉันมี UIBarButtonItem ที่เปิดแผ่นงานเพื่อเสนอทางเลือกให้ผู้ใช้เกี่ยวกับสิ่งที่ต้องทำ ทุกอย่างทำงานตามที่คาดไว้เว้นแต่ฉันจะพยายามคลิกที่ปุ่ม "ยกเลิก" เป้าหมายของปุ่มดูเหมือนจะเลื่อนขึ้นจากที่ที่ควรจะเป็น ฉันสามารถเปิดใช้งานได้โดยคลิกที่ตรงกลางของปุ่ม "ยกเลิก" และ "ตกลง" เท่านั้น

ฉันได้ลองใช้ Action Sheet ในแอปพลิเคชั่นอื่น ๆ แล้วและทำงานได้ดีไม่ใช่แค่นิ้วโป้งใหญ่ของฉัน แผ่นงานกำลังเปิดใน 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];
}

5
ในบันทึกที่ไม่เกี่ยวข้องฉันได้รับแจ้งที่ WWDC ในระหว่างเซสชันการตรวจสอบ UI ของ Apple ว่าปุ่มสีแดงบน Action Sheets มีไว้สำหรับการกระทำ 'ทำลายล้าง' (เช่น 'ลบ')
Ramin

ใช่ฉันอ่านหลักเกณฑ์การเชื่อมต่อกับมนุษย์เมื่อเร็ว ๆ นี้และเห็นว่า เปลี่ยนจากสีแดงเป็นสีเทา
nevan king

คำตอบ:


190

แทนการส่งผ่านมุมมองของตัวควบคุมมุมมองปัจจุบันออกไปยังแผ่นการดำเนินการใช้วิธีการของshowFromTabBar:UIActionSheet

วิธี
นี้จะให้พื้นที่เคาะที่ถูกต้อง:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

วิธีที่ผิดวิธี
นี้จะทำให้พื้นที่ที่แตะได้ผิดตำแหน่ง (หากคุณใช้แถบแท็บหรือแถบเครื่องมือ):

[actionSheet showInView:self.view];

หากคุณกำลังใช้แถบเครื่องมือให้ใช้showFromToolbar:วิธีนี้แทน คุณจะต้องมีการอ้างอิงถึงแถบเครื่องมือซึ่งน่าจะเป็นไอวาร์

[actionSheet showFromToolbar:self.myToolbar];

คำตอบเก่าของฉันยังใช้งานได้ แต่แฮ็ก:

เพิ่งพบคำตอบที่เป็นไปได้:

01-Dec-2008 22:22 PM Tom Saxton: ฉันดูข้อบกพร่องนี้มากกว่านี้และดูเหมือนว่าจะมีปัญหากับแถบแท็บ

หากคุณเรียกใช้ [sheet showInView: self.view] ของ UIActionSheet จากตัวควบคุมมุมมองที่เป็นลูกของ UITabViewController การทดสอบการกดปุ่มยกเลิกจะล้มเหลวในส่วนของ UIActionSheet ที่อยู่เหนือมุมมองของแถบแถบ

หากคุณส่งผ่านในมุมมองของ UITabBarController แทนดังนั้น UIActionSheet จะทำหน้าที่ตามที่คาดไว้

หมายเหตุ: ใน iPhone OS 2.1 และรุ่นก่อนหน้า UIActionSheet จะขึ้นมาจากด้านบนของแถบแท็บเมื่อคุณส่งผ่านมุมมองของเด็ก แต่ใน 2.2 จะปรากฏขึ้นจากด้านล่างของแถบแท็บและครอบคลุมมุมมองแท็บด้วย

http://openradar.appspot.com/6410780

แก้ไข:ทำงานได้อย่างถูกต้องเมื่อฉันเปลี่ยนมุมมองเป็นมุมมองของแถบแท็บ

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

โหวตขึ้นเพราะมันได้ผล ทำไมถึงดีกว่าคำตอบอื่น ๆ ?
bentford

1
ทำไมต้อง parentViewController? แม้ว่ามุมมองจะอยู่ในแท็บมุมมองการนำทาง BarController ก็ควรชี้ไปยังตำแหน่งที่ถูกต้อง ใช้งานได้สำหรับฉันโดยไม่มี parentViewController ไม่ว่าในกรณีใด ๆ
นาธาน

11
คำตอบอื่นดูเหมือนจะดีกว่า มองหา [actionSheet showInView: [self.view window]] ดูเหมือนตรงไปตรงมาและทั่วไปมากขึ้น
Kevin

ขอบคุณมากสำหรับการโพสต์คำตอบนี้
fulvio

1
ฉันไม่มีแถบแท็บในแอปของฉัน แต่ยังคงมีปัญหาดังกล่าว ฉันแก้ไขด้วย '[serf.view window]' ไม่ใช่ปัญหาแถบแท็บอยู่ดี
Mike Keskinov

37

ฉันพบคำตอบตรงนี้ว่าได้ผล

ใช้: [filterActionSheet showInView:[self.view window]];

ฉันลองใช้สองสามวิธีในการไปที่แถบแท็บของฉันและวิธีการตั้งค่าแอพนี้ดูเหมือนซับซ้อน ...


ที่สมบูรณ์แบบ! ขอบคุณ นี่เป็นวิธีแก้ปัญหาที่ถูกต้องสำหรับฉันเนื่องจากฉันมีปัญหากับ UITableViewController ที่มีแถบเครื่องมือไม่ใช่ TabBar เหมือนที่อื่น ๆ ที่นี่
William Denniss

สิ่งที่ดีนี้ได้ผลสำหรับฉัน! นี่เป็นวิธีที่ง่ายที่สุดแน่นอน!
cgossain

2
มันทำให้เกิดปัญหาอื่น ActionSheet จะปรากฏในแนวตั้งเมื่ออุปกรณ์อยู่ในแนวนอน (รวมถึงเนื้อหาอื่น ๆ ทั้งหมด)
Mike Keskinov

22

ใช้แทน:

[sheet showFromTabBar:theTabBar];

1
ฉันได้รับการแก้ไขจากนี้ไปshowInTabBar: showFromTabBar:โปรดทราบว่ามีเมธอด 'showFromToolbar:' ขึ้นอยู่กับเฟอร์นิเจอร์หน้าจอที่คุณมีที่ด้านล่างของหน้าจอ ฉันคิดว่านี่เป็นคำตอบที่ดีกว่าคำตอบที่ได้รับการยอมรับ
Stephen Darlington

Stephen อยากรู้ไหมว่าทำไมคุณถึงคิดว่าสิ่งนี้ดีกว่าการระบุ showInView: theTabBar? จากมุมมองการมีเพศสัมพันธ์ฉันคิดว่า showInView น่าจะเหมาะกว่าในกรณีที่แท็บบาร์หลุดในภายหลังอาจถูกแทนที่ด้วยแถบเครื่องมือเป็นต้น ตัวควบคุมมุมมองย่อยโดยเฉพาะไม่ควรต้องรู้หรือสนใจจริงๆฉันคิดว่า
Billy Gray

หากแถบแท็บหลุดในภายหลังคุณจะต้องแก้ไขบรรทัดของโค้ดนั้นโดยไม่คำนึงถึง (เว้นแต่ว่า TabBar อาจเป็นข้อมูลอ้างอิงที่มีชื่อไม่ดีสำหรับมุมมองที่ส่งผ่าน) ดังนั้นฉันจึงไม่เห็นว่าวิธีนี้ควบคู่ไปกับ showInView: theTabBar อย่างไร ฉันใช้ showFromTabBar: เช่นกันเพราะดูเหมือนว่าจะปลอดภัยกว่าสำหรับฉัน ฉันไม่รู้ว่าเกิดอะไรขึ้นภายใต้ฝาครอบ แต่ฉันคิดว่า showFromTabBar: มีโอกาสน้อยที่จะทำลายในการเปิดตัว OS ในอนาคตน้อยกว่า showFromView: ด้วยมุมมองแถบแท็บ
Christopher Pickslay


5

ฉันคิดว่าคำตอบทั้งสามรวมกันเป็นวิธีที่ถูกต้องในการจัดการสิ่งนี้:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

กล่าวคือใช้ showFromTabBar (นั่นคือเหตุผลว่าทำไมจึงมีอยู่) และคุณไม่จำเป็นต้องใช้ parentViewController ตามที่นาธานชี้ให้เห็น (อันที่จริง self.parentViewController.tabBarController.tabBar คืนค่าศูนย์ให้ฉัน


แน่นอนว่าจะคืนค่า nil เนื่องจากตัวควบคุมมุมมองหลัก (ซึ่งก็คือ UITabBarViewController) ไม่ได้ซ้อนตัวเองลงใน UITabBarController อื่นดังนั้นคุณสมบัติ tabBarController จึงเป็นศูนย์
Dominik Seibold

1

FYI - มีปัญหาเดียวกันกับแผ่นการดำเนินการของ UIDocumentInteractionController ที่เหยียบบนแถบแท็บ ใช้สิ่งต่อไปนี้เพื่อแก้ไข

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.