“ แอปพลิเคชันพยายามที่จะนำเสนอตัวควบคุมที่ใช้งานอยู่แบบโมดูลาร์”?


101

ฉันเพิ่งพบข้อขัดข้องที่แสดงNSInvalidArgumentExceptionข้อความนี้ในแอปซึ่งไม่เคยทำมาก่อน

แอปพลิเคชันพยายามนำเสนอคอนโทรลเลอร์ UITabBarController แบบโมดูลาร์: 0x83d7f00

ฉันมีสิ่งUITabBarControllerที่ฉันสร้างในAppDelegateและให้อาร์เรย์ของUIViewControllers.

หนึ่งในนั้นที่ฉันต้องการนำเสนอแบบสุภาพเมื่อแตะที่มัน ฉันทำได้โดยใช้วิธีการมอบหมาย

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

หากตัวควบคุมมุมมองนั้นอยู่ในคลาสของตัวควบคุมที่ฉันต้องการนำเสนอแบบโมฆะฉันจะส่งคืน NO และทำ

[tabBarController presentModalViewController:viewController animated:YES];

และตอนนี้ฉันได้รับข้อผิดพลาดนั้นซึ่งดูเหมือนว่าหมายความว่าคุณไม่สามารถนำเสนอตัวควบคุมมุมมองแบบโมเดิร์นที่ใช้งานอยู่ที่อื่นได้ (ในแถบแท็บ ... ) ฉันควรบอกว่าฉันใช้ XCode 4.2 Developer Preview 7 ดังนั้น นี่คือ iOS 5 (ฉันรู้เกี่ยวกับ NDA แต่ฉันคิดว่าฉันไม่ได้ให้รายละเอียดต้องห้ามใด ๆ ) ขณะนี้ฉันไม่มีการติดตั้ง XCode เพื่อทดสอบว่าสิ่งนี้ขัดข้องที่คอมไพล์กับ iOS4 SDK หรือไม่ แต่ฉันเกือบทั้งหมดไม่แน่ใจ

ฉันแค่อยากถามว่าใครเคยประสบปัญหานี้หรือมีข้อเสนอแนะใด ๆ


ก่อนหน้า iOS 5 สิ่งนี้ไม่ได้เพิ่มข้อยกเว้น แต่กลับไม่มีอะไรเลย ตั้งแต่ iOS 5 เป็นต้นไปคำสั่งนี้จะทำให้เกิดข้อยกเว้น
Frédéric Adda

คำตอบ:


104

สมมติว่าคุณมีตัวควบคุมมุมมองสามตัวที่สร้างอินสแตนซ์ดังนี้:

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

คุณได้เพิ่มลงในแถบแท็บดังนี้:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

ตอนนี้คุณกำลังพยายามทำสิ่งนี้:

[tabBarController presentModalViewController:vc3];

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

Apple คาดหวังให้คุณปฏิบัติต่อองค์ประกอบ UI ด้วยวิธีใดวิธีหนึ่ง สิ่งนี้อาจถูกฝังอยู่ใน Human Interface Guidelines บางแห่งว่า "อย่าทำเช่นนี้เพราะเราไม่ได้คาดหวังว่าคุณจะต้องการทำสิ่งนี้"


6
สิ่งนี้ไม่มีปัญหาอย่างแน่นอนก่อนหน้า iOS 5 ดังนั้นฉันจึงกังวล! สิ่งที่ฉันทำคือเพิ่ม UIViewController จำลองลงในแถบแท็บและนำเสนออินสแตนซ์คลาสย่อยของตัวควบคุมมุมมองที่แท้จริงแบบโมเดิร์น
Javier Soto

1
@Iswank ตอนนี้ใน iOS 6 เพื่อให้สิ่งต่างๆ "ง่ายขึ้น" พวกเขาเลิกใช้งาน presentModalViewController ทำให้เกิดปัญหาการหมุนทุกรูปแบบ ... คุณต้องใช้ presentViewController: ภาพเคลื่อนไหว: การทำให้สมบูรณ์และตรวจสอบว่าแอปของคุณจัดการการเปลี่ยนแปลงอย่างไร
Whyoz

15

ผมมีปัญหาเดียวกัน. ฉันพยายามนำเสนอดูคอนโทรลเลอร์หลังจากปิด

[self dismissModalViewControllerAnimated:YES];

เมื่อฉันพยายามทำโดยไม่มีภาพเคลื่อนไหวมันก็ทำงานได้อย่างสมบูรณ์ดังนั้นปัญหาคือคอนโทรลเลอร์ยังมีชีวิตอยู่ ฉันคิดว่าทางออกที่ดีที่สุดคือใช้dismissViewControllerAnimated:completion:สำหรับ iOS5


มันจะล้มเหลวถ้าคุณปิดมันเป็นภาพเคลื่อนไหวเนื่องจากเมื่อถึงเวลาที่คุณต้องการนำเสนอตัวควบคุมมุมมองโมดอลอีกครั้งมันยังคงอยู่บนหน้าจอแบบโมดอลโดยไม่เคลื่อนไหว
Pascal

2
ถูกถอดออกใน IOS 6.0
Sumit Kumar Saha

12

ในกรณีของฉันฉันพยายามนำเสนอ viewController (ฉันมีการอ้างอิงของ viewController ใน TabBarViewController) จากตัวควบคุมมุมมองที่แตกต่างกันและมันขัดข้องด้วยข้อความข้างต้น ในกรณีนี้เพื่อหลีกเลี่ยงการนำเสนอคุณสามารถใช้ได้

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

อาจช่วยใครสักคน


มันใช้งานได้เฉพาะใน viewWillappperar แต่เมื่อฉันตรวจสอบก่อนที่จะนำเสนอ viewController ซึ่งนำเสนอไปแล้วมันจะส่งคืนเท็จเสมอ
กูรู

1
ไม่ทำงานสำหรับฉัน ยังคงได้รับแอปขัดข้อง (! viewController.presentingViewController) ได้รับการแก้ไขปัญหา
Argus

3

ฉันมีปัญหาเดียวกันฉันแก้มัน คุณสามารถลองใช้รหัสนี้:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

3

ข้อผิดพลาดปัญหาเดียวกันที่เกิดขึ้นกับฉันเมื่อฉันพยายามที่จะpresentเป็นตัวควบคุมมุมมองของเด็กแทนของUINavigationViewControllerผู้ปกครอง


0

เพียงแค่ลบ

[tabBarController presentModalViewController:viewController animated:YES];

และเก็บไว้

[self dismissModalViewControllerAnimated:YES];

สิ่งนี้ให้คำเตือนที่เลิกใช้แล้ว ... แล้วทางเลือกนี้คืออะไร?
Kirtikumar ก.

ที่นี่ฉันใช้ [blockSelf ไล่ออกViewControllerAnimate: YES เสร็จสิ้น: nil];
Kirtikumar ก.


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