Lỗi “Cửa sổ ứng dụng dự kiến ​​có bộ điều khiển chế độ xem gốc khi kết thúc khởi chạy ứng dụng” khi chạy dự án với Xcode 7, iOS 9


89

Sau khi chạy chức năng

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

có một sự cố:

 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

Dự án này là một dự án cũ, tôi nên làm gì để nó xây dựng và chạy với Xcode 7 và iOS 9?


Vì Xcode 7 là bản beta nên có lẽ bạn nên quay lại Xcode 6 cho bất kỳ công việc phát triển nghiêm túc nào.
Paul R


xin chào, tôi nhận được lỗi này: - *** Xác nhận không thành công trong - [UIApplication _runWithMainScene: transferContext: complete:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 làm thế nào để giải quyết này
Akash Raghani

Câu trả lời:


175

Từ thông báo lỗi của bạn:

Các cửa sổ ứng dụng dự kiến ​​sẽ có bộ điều khiển chế độ xem gốc khi kết thúc khởi chạy ứng dụng

Dự án "cũ" này bao nhiêu tuổi? Nếu đã hơn một vài năm, bạn có còn:

[window addSubview:viewController.view];

Bạn nên thay thế nó bằng:

[window setRootViewController:viewController];

1
Tôi gặp vấn đề tương tự và tôi nghĩ đó là vấn đề iOS 9. Dự án của tôi hoạt động trong iOS 7 & 8. Vì một số lý do mà chế độ xem từ bảng phân cảnh không được đặt chính xác.
David Snabel-Caunt

3
Cảm ơn rât nhiều . câu trả lời là trong thông báo lỗi: "Ứng dụng cửa sổ" Tôi thấy có hai cửa sổ trong dự án của tôi, một là widdow bình thường, người kia là một modual bên thứ ba được gọi là
andrew wang

3
MTStatusBarOverlay và nó không có RootViewController, iOS9 yêu cầu tất cả các Window phải có rootViewController.
andrew wang

1
Vâng, cuối cùng tôi đã tìm thấy cùng một vấn đề. Ứng dụng của tôi có một cửa sổ bổ sung không có bộ điều khiển chế độ xem gốc.
David Snabel-Caunt

1
Tôi đã tìm thấy giải pháp phù hợp với mình: stackoverflow.com/a/32719949/1881895
barrast

37

Nếu bạn đã đặt rootViewController của ủy quyền ứng dụng self.window của bạn và vẫn gặp lỗi này trong thời gian chạy, thì có thể bạn có nhiều cửa sổ trong UIApplication của mình, một trong số đó có thể không có rootViewController được liên kết. Bạn có thể lặp lại các cửa sổ ứng dụng của mình và liên kết viewController trống với rootViewController của nó để sửa lỗi bạn đang gặp phải.

Đây là mã lặp qua các cửa sổ ứng dụng và liên kết ViewController trống với rootViewController nếu thiếu cửa sổ.

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

Cập nhật: Rõ ràng có một cửa sổ dành riêng cho thanh trạng thái thường gây ra sự cố này. Đoạn mã trên sẽ khắc phục được lỗi này.


2
Cảm ơn!! Điều này hóa ra là vấn đề đối với tôi. Tôi đã đặt bộ điều khiển chế độ xem chính, nhưng ứng dụng có cửa sổ thứ hai mà tôi không biết.
n13 23/09/15

Thật chắc chắn ... Tôi không phải là tân binh và cái này đã nhận được tôi khi cập nhật lên Xcode 7.1 chạy iOS 9.1 ... thanh trạng thái có một cửa sổ dành riêng ... tất nhiên là có ?! Tôi đang ẩn thanh trạng thái nếu điều đó có ý nghĩa với bất kỳ ai.
whyoz

Chà, tôi có 2 trong số 12 ứng dụng của mình gặp sự cố để xem xét Ứng dụng và điều này dường như đã khắc phục được.
Andrew Smith

Làm việc tuyệt vời !! Gotta love "Rõ ràng có một cửa sổ dành riêng cho thanh trạng thái thường gây ra sự cố này." KHÔNG thấy điều đó sắp xảy ra.
eGanges

1
Phương thức này có thể dẫn đến việc viewDidLoad và viewWillAppear được gọi hai lần trên rootViewController của bạn. Nếu bạn có cửa sổ init theo cách thủ công, hãy kiểm tra plist của bạn và đảm bảo rằng bạn KHÔNG có Window.xib được xác định là "Tên cơ sở tệp nib chính" nếu bạn thấy mọi thứ được gọi hai lần sau khi sử dụng giải pháp này. Sau đó, bạn chỉ cần xóa mã này và setRootViewController như bình thường.
whyoz

21

XCODE 7 yêu cầu tất cả Windows phải có rootViewController Bạn có thể sử dụng dễ dàng:

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

Nó hoạt động tốt nếu bạn chỉ cần sử dụng UIWindow (đối với các ví dụ dễ hiểu từ bất kỳ Hướng dẫn nào - trước Xcode 7)!


Chào mừng bạn đến với Stack Overflow! Vui lòng xem xét chỉnh sửa bài đăng của bạn để thêm giải thích về những gì mã của bạn làm và tại sao nó sẽ giải quyết vấn đề. Một câu trả lời chủ yếu chỉ chứa mã (ngay cả khi nó đang hoạt động) thường sẽ không giúp OP hiểu được vấn đề của họ.
SuperBiasedMan

Cảm ơn, điều đó đã tránh được cảnh báo iOS ~ 3–8 của tôi => iOS 9 bị lỗi, nhưng đã đưa ra cảnh báo của trình phân tích tĩnh về rò rỉ. Vì vậy, tôi đã chuyển phần khai báo sang giao diện trong tiêu đề, với việc gán trong applicationDidFinishLaunching. Sau đó, tôi đã thêm [vc release] vào dealloc.
Flash Sheridan

13

Có vẻ như kể từ iOS 9.1 (?) Hoặc Xcode 7.1 bất kỳ UIWindowkhởi tạo nào trong quá trình khởi tạo application(_:didFinishLaunchingWithOptions:)cần phải có một rootViewControllerbộ trước khi rời khỏi phương pháp đó.

Trước đây, chỉ cần cửa sổ chính có một rootViewControllerbộ trong phương thức đó là đủ. Bây giờ bất kỳ UIWindowtrường hợp nào cũng cần phải có một thuộc tính hợp lệ rootViewController.

Thủ phạm ở đây có thể là mã của riêng bạn nếu bạn sử dụng UIWindowvà cũng có thể là bất kỳ thư viện bên thứ ba nào khác cố gắng khởi tạo phiên bản mới UIWindowtrong thời gian này (như lớp phủ thông báo trên thanh trạng thái, v.v.).

LƯU Ý : Bạn cũng gặp phải lỗi tương tự nếu bạn không đặt rootViewControlertrên cửa sổ chính của mình hoặc nếu bảng phân cảnh của bạn không được thiết lập đúng. Đề cập đến điều này như một lưu ý phụ vì những trường hợp đó khá rõ ràng và dễ sửa.


Bạn đang rực rỡ: D, nhờ người đàn ông tôi chỉ bình luận initialisation của cửa sổ và tất cả là OK bây giờ
mohammad alabid

3

Điều này cũng đã khiến tôi ngày hôm nay gặp khó khăn và tôi phải mất vài giờ để khắc phục nó: Ứng dụng của tôi có cửa sổ trong "MainWindow.xib", hoàn chỉnh với bộ điều khiển điều hướng và bộ điều khiển chế độ xem gốc đi kèm, tất cả đều được khởi tạo tự động theo thứ tự thích hợp , với Xcode 6 và iOS8.

Trên iOS9 Ứng dụng đó vẫn chạy tốt khi được tải xuống từ AppStore, nhưng không chạy khi mới được xây dựng bằng Xcode 7 và chạy trên iOS 9. Tại thời điểm người ủy quyền ứng dụng đang thực thi ứng dụng của nóDidBecomeActive: phương pháp điều khiển chế độ xem gốc hiện không được tải, vì nó đã từng là trước đây! Điều đó đã làm cho bộ điều khiển chế độ xem gốc bỏ lỡ cuộc gọi đến mã trạng thái khôi phục của tôi.

Tôi đã sửa lỗi này bằng cách tự khởi tạo bộ điều khiển chế độ xem gốc, trong mã và khôi phục trạng thái của nó từ viewDidLoad, một cách rõ ràng.


2

Bạn nên đặt thuộc tính rootviewcontroller của mọi cửa sổ trong ứng dụng của mình


Câu trả lời của bạn đã giúp tôi
Aznix 7/10/15

2

Tôi có một dự án cũ hơn hoạt động trong iOS 8 nhưng không phải iOS 9. Nếu Giao diện chính của bạn được đặt thành MainWindow.xib, hãy cập nhật nó lên bảng phân cảnh. CÁi này đã sửa nó giúp tôi:

  1. Tạo một dự án mới, Ứng dụng Single View là được.
  2. Sao chép tệp Main.storyboard vào dự án của bạn hoặc bạn có thể tạo tệp của riêng bạn.
  3. Mở Cài đặt Dự án của bạn và Đặt Giao diện Chính của bạn thành Main.storyboard Đặt Giao diện chính của bạn thành Main.storyboard

1

Chỉ cần đặt rootViewController của bạn thành navigationController, là UIViewController của bạn trong app-Delegate.rb như mã của tôi bên dưới. Tôi mới sử dụng ruby ​​nhưng hy vọng điều này sẽ giúp ...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

1

Tôi gặp phải vấn đề này với một ứng dụng mà tôi ít thừa hưởng hơn. Sau khi xác minh rằng bảng phân cảnh đã được thiết lập đúng cách làm giao diện chính của ứng dụng và bảng phân cảnh có RootViewController, tôi vẫn gặp sự cố.

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

Điều tôi phát hiện ra sau một số cuộc điều tra thêm rằng sự cố xảy ra do một số logic chế độ xem (SVProgressHud) được gọi vào - (void)applicationDidBecomeActive:(UIApplication *)application. Đây có vẻ là hành vi mới trong Xcode7 nhưng theo như tôi có thể nói thì SVProgressHud đã tham chiếu rootviewcontroller trước khi nó được thiết lập bởi bảng phân cảnh. Cuối cùng, cập nhật SVProgressHud lên 2.0 đã sửa lỗi.


0

Giải pháp Swift 2 phù hợp với tôi:

Chèn đoạn mã bên dưới vào AppDelegate -> didFinishLaunchingWithOptions

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.