"คาดว่าหน้าต่างแอปพลิเคชันจะมีตัวควบคุมมุมมองรูทเมื่อสิ้นสุดการเปิดแอปพลิเคชัน" เกิดข้อผิดพลาดเมื่อเรียกใช้โปรเจ็กต์ด้วย Xcode 7, iOS 9


89

หลังจากเรียกใช้ฟังก์ชัน

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

มีความผิดพลาด:

 Assertion failure in 
-[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', `enter code here`reason: 'Application windows are expected to have a root view controller at the end of application launch'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000109377885 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x0000000108df0df1 objc_exception_throw + 48
    2   CoreFoundation                      0x00000001093776ea +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x0000000108a42bb1 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
    4   UIKit                               0x000000010760e350 -[UIApplication _runWithMainScene:transitionContext:completion:] + 2875
    5   UIKit                               0x000000010760b73f -[UIApplication workspaceDidEndTransaction:] + 188
    6   FrontBoardServices                  0x000000010b87fd7b FrontBoardServices + 163195
    7   FrontBoardServices                  0x000000010b880118 FrontBoardServices + 164120
    8   CoreFoundation                      0x00000001092a20f1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    9   CoreFoundation                      0x0000000109297eac __CFRunLoopDoSources0 + 556
    10  CoreFoundation                      0x0000000109297363 __CFRunLoopRun + 867
    11  CoreFoundation                      0x0000000109296d78 CFRunLoopRunSpecific + 488
    12  UIKit                               0x000000010760b091 -[UIApplication _run] + 402
    13  UIKit                               0x000000010760f79b UIApplicationMain + 171
    14  bbwc                                0x00000001037a9998 main + 344
    15  libdyld.dylib                       0x000000010a45ca05 libdyld.dylib + 10757
    16  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

โปรเจ็กต์นี้เป็นโปรเจ็กต์เก่าฉันจะสร้างและรันด้วย Xcode 7 และ iOS 9 ได้อย่างไร


เนื่องจาก Xcode 7 เป็นเบต้าคุณจึงควรกลับไปใช้ Xcode 6 เพื่อพัฒนางานอย่างจริงจัง
Paul R


สวัสดีฉันได้รับความผิดพลาดนี้: - *** การยืนยันล้มเหลวใน - [UIApplication _runWithMainScene: transitionContext: complete:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 วิธีแก้ปัญหานี้
Akash Raghani

คำตอบ:


175

จากข้อความแสดงข้อผิดพลาดของคุณ:

หน้าต่างแอ็พพลิเคชันคาดว่าจะมีตัวควบคุมมุมมองรูทเมื่อสิ้นสุดการเปิดแอปพลิเคชัน

โครงการนี้ "เก่า" แค่ไหน? หากเกินสองสามปีคุณยังมี:

[window addSubview:viewController.view];

คุณควรแทนที่ด้วย:

[window setRootViewController:viewController];

1
ฉันมีปัญหาเดียวกันและคิดว่าเป็นปัญหา iOS 9 โครงการของฉันทำงานใน iOS 7 และ 8 ด้วยเหตุผลบางประการทำให้มุมมองจากกระดานเรื่องราวไม่ได้รับการตั้งค่าอย่างถูกต้อง
David Snabel-Caunt

3
ขอบคุณมาก . คำตอบอยู่ในข้อความแสดงข้อผิดพลาด: "Application windows" ฉันพบว่ามีสองหน้าต่างในโปรเจ็กต์ของฉันอันหนึ่งคือ widdow ปกติอีกอันเป็น modual ของบุคคลที่สามที่เรียกว่า
andrew wang

3
MTStatusBarOverlay และไม่มี RootViewController iOS9 ต้องการหน้าต่างทั้งหมดต้องมี rootViewController
andrew wang

1
ใช่ฉันพบปัญหาเดียวกันในที่สุด แอปของฉันมีหน้าต่างเพิ่มเติมซึ่งไม่มีตัวควบคุมมุมมองรูท
David Snabel-Caunt

1
ฉันพบวิธีแก้ปัญหาที่เหมาะกับฉัน: stackoverflow.com/a/32719949/1881895
barrast

37

หากคุณได้ตั้งค่า rootViewController ของ self.window ใน app delegate ของคุณแล้วและยังคงได้รับข้อผิดพลาดนี้ขณะรันไทม์แสดงว่าคุณอาจมีหน้าต่างมากกว่าหนึ่งหน้าต่างในโปรแกรม UIA ของคุณซึ่งหนึ่งในนั้นอาจไม่มี rootViewController ที่เกี่ยวข้อง คุณสามารถวนลูปผ่านหน้าต่างแอพของคุณและเชื่อมโยง viewController ที่ว่างเปล่ากับ rootViewController เพื่อแก้ไขข้อผิดพลาดที่คุณได้รับ

นี่คือรหัสที่วนผ่านหน้าต่างแอพและเชื่อมโยง ViewController ที่ว่างเปล่ากับ rootViewController หากไม่มีหน้าต่าง

NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
    NSLog(@"window: %@",window.description);
    if(window.rootViewController == nil){
        UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
        window.rootViewController = vc;
    }
}

อัปเดต: เห็นได้ชัดว่ามีหน้าต่างเฉพาะสำหรับแถบสถานะซึ่งมักทำให้เกิดปัญหานี้ โค้ดด้านบนควรแก้ไขข้อผิดพลาดนี้


2
ขอบคุณ !! สิ่งนี้กลายเป็นปัญหาสำหรับฉัน ฉันได้ตั้งค่าตัวควบคุมมุมมองหลัก แต่แอปมีหน้าต่างที่สองซึ่งฉันไม่รู้ตัว
13

มั่นคงมาก ... ฉันไม่ใช่มือใหม่และสิ่งนี้ทำให้ฉันได้รับเมื่ออัปเดตเป็น Xcode 7.1 ที่ใช้ iOS 9.1 ... แถบสถานะมีหน้าต่างเฉพาะ ... แน่นอนว่าเป็นอย่างไร! ฉันกำลังซ่อนแถบสถานะหากนั่นมีความหมายกับใครก็ตาม
whyoz

ว้าวฉัน 2 ใน 12 แอปของฉันขัดข้องสำหรับการตรวจสอบแอปและดูเหมือนว่าจะแก้ไขได้
Andrew Smith

ทำงานได้ดี !! ต้องรัก "เห็นได้ชัดว่ามีหน้าต่างเฉพาะสำหรับแถบสถานะซึ่งมักทำให้เกิดปัญหานี้" ไม่เห็นว่าจะมา
eGanges

1
วิธีนี้อาจส่งผลให้ viewDidLoad และ viewWillAppear ถูกเรียกสองครั้งบน rootViewController ของคุณ หากคุณมีหน้าต่างเริ่มต้นด้วยตนเองให้ตรวจสอบ plist ของคุณและตรวจสอบให้แน่ใจว่าคุณไม่มี Window.xib กำหนดเป็น "ชื่อฐานของไฟล์หัวปากกาหลัก" หากคุณเห็นสิ่งที่เรียกสองครั้งหลังจากใช้วิธีแก้ปัญหานี้ จากนั้นคุณเพียงแค่ต้องลบรหัสนี้และ setRootViewController เหมือนที่คุณทำตามปกติ
whyoz

21

XCODE 7 ต้องการให้ Windows ทั้งหมดต้องมี rootViewController คุณสามารถใช้งานง่าย:

UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = vc;

มันใช้งานได้ดีถ้าคุณต้องการใช้ UIWindow เท่านั้น (สำหรับตัวอย่างง่ายๆจากบทช่วยสอนใด ๆ - ก่อน Xcode 7)!


ยินดีต้อนรับสู่ Stack Overflow! โปรดพิจารณาแก้ไขโพสต์ของคุณเพื่อเพิ่มคำอธิบายเพิ่มเติมว่าโค้ดของคุณใช้ทำอะไรและทำไมถึงแก้ปัญหาได้ คำตอบที่ส่วนใหญ่มีเพียงรหัส (แม้ว่าจะใช้งานได้) มักจะไม่ช่วยให้ OP เข้าใจปัญหาของพวกเขา
SuperBiasedMan

ขอบคุณที่หลีกเลี่ยงคำเตือน iOS ~ 3–8 ของฉัน => iOS 9 ขัดข้อง แต่ให้คำเตือนตัววิเคราะห์แบบคงที่เกี่ยวกับการรั่วไหล ดังนั้นฉันจึงย้ายการประกาศไปที่อินเทอร์เฟซในส่วนหัวโดยมีการกำหนดใน applicationDidFinishLaunching จากนั้นฉันก็เพิ่ม [vc release] ไปที่ dealloc
Flash Sheridan

13

ดูเหมือนว่าตั้งแต่ iOS 9.1 (?) หรือ Xcode 7.1 ใด ๆ ที่UIWindowสร้างอินสแตนซ์ในระหว่าง application(_:didFinishLaunchingWithOptions:)จำเป็นต้องมีการrootViewControllerตั้งค่าก่อนที่จะออกจากวิธีนั้น

ก่อนหน้านี้มีเพียงหน้าต่างหลักเท่านั้นที่จะมีการrootViewControllerตั้งค่าระหว่างวิธีการนั้น ตอนนี้UIWindowอินสแตนซ์ใด ๆจำเป็นต้องมีrootViewControllerคุณสมบัติที่ถูกต้อง

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

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


คุณยอดเยี่ยมมาก: D ขอบคุณที่ฉันแสดงความคิดเห็นเกี่ยวกับการเริ่มต้นของหน้าต่างและทุกอย่างก็โอเคแล้ว
mohammad alabid

3

สิ่งนี้ได้กัดฉันในวันนี้เช่นกันและฉันต้องใช้เวลาสองสามชั่วโมงในการแก้ไข: แอพของฉันมีหน้าต่างใน "MainWindow.xib" พร้อมด้วยตัวควบคุมการนำทางและตัวควบคุมมุมมองรูทที่มาพร้อมกับซึ่งทั้งหมดได้รับการสร้างอินสแตนซ์โดยอัตโนมัติตามลำดับที่เหมาะสม ด้วย Xcode 6 และ iOS8

เมื่อวันที่ iOS9 ที่ App ยังคงทำงานดีเมื่อดาวน์โหลดได้จาก AppStore แต่ไม่ได้เมื่อสร้างขึ้นใหม่ด้วย Xcode 7 และรันบน iOS 9. ในขณะที่ผู้แทนจากแอปรัน applicationDidBecomeActive ที่: วิธีการควบคุมดูรากอยู่ในขณะนี้ไม่ได้โหลดเป็นมัน เคยเป็นมาก่อน! นั่นทำให้ตัวควบคุมมุมมองรูทพลาดการเรียกรหัสสถานะการกู้คืนของฉัน

ฉันแก้ไขสิ่งนี้โดยการสร้างอินสแตนซ์ตัวควบคุมมุมมองรูทด้วยตัวเองในรหัสและกู้คืนสถานะจาก viewDidLoad อย่างชัดเจน


2

คุณควรตั้งค่าคุณสมบัติ rootviewcontroller ของทุกหน้าต่างในแอปของคุณ


คำตอบของคุณช่วยฉัน
Aznix

2

ฉันมีโปรเจ็กต์รุ่นเก่าที่ทำงานใน iOS 8 แต่ไม่ใช่ iOS 9 หากอินเทอร์เฟซหลักของคุณตั้งค่าเป็น MainWindow.xib ให้อัปเดตเป็นสตอรีบอร์ด สิ่งนี้แก้ไขให้ฉัน:

  1. สร้างโปรเจ็กต์ใหม่แอปพลิเคชั่น Single View ก็ใช้ได้
  2. คัดลอกไฟล์ Main.storyboard ไปยังโปรเจ็กต์ของคุณหรือคุณอาจสร้างขึ้นมาเอง
  3. เปิดการตั้งค่าโครงการของคุณและตั้งค่าอินเทอร์เฟซหลักของคุณเป็น Main.storyboard ตั้งค่าอินเทอร์เฟซหลักของคุณเป็น Main.storyboard

1

เพียงตั้งค่า rootViewController ของคุณเป็น navigationController ซึ่งเป็น UIViewController ของคุณใน app-delegate.rb เหมือนโค้ดของฉันด้านล่าง ฉันใหม่กับทับทิม แต่หวังว่านี่จะช่วยได้ ...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

1

ฉันพบปัญหานี้กับแอปที่ฉันได้รับมรดกน้อยกว่า หลังจากตรวจสอบว่าสตอรีบอร์ดได้รับการตั้งค่าอย่างถูกต้องเป็นอินเทอร์เฟซหลักของแอพและสตอรีบอร์ดมี RootViewController ฉันยังคงได้รับความผิดพลาด

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

สิ่งที่ผมค้นพบหลังจากการสอบสวนเพิ่มเติมบางอย่างที่ผิดพลาดถูกเกิดจากตรรกะมุมมองบางคน (SVProgressHud) - (void)applicationDidBecomeActive:(UIApplication *)applicationถูกเรียกใน นี่ดูเหมือนจะเป็นพฤติกรรมใหม่ใน Xcode7 แต่เท่าที่ฉันสามารถบอกได้ว่า SVProgressHud อ้างถึง rootviewcontroller ก่อนที่จะตั้งค่าโดยกระดานเรื่องราว ในที่สุดการอัปเดต SVProgressHud เป็น 2.0 จะแก้ไขข้อบกพร่อง


0

โซลูชัน Swift 2 ที่เหมาะกับฉัน:

ใส่โค้ดด้านล่างใน AppDelegate -> didFinishLaunchingWithOptions

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass

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