Kesalahan "Jendela aplikasi diharapkan memiliki pengontrol tampilan root di akhir peluncuran aplikasi" saat menjalankan proyek dengan Xcode 7, iOS 9

89

Setelah menjalankan fungsi

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

ada kecelakaan:

 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

Proyek ini adalah proyek lama, apa yang harus saya lakukan untuk membuatnya dibangun dan dijalankan dengan Xcode 7 dan iOS 9?

andrew wang
sumber
Karena Xcode 7 adalah beta, Anda mungkin harus kembali ke Xcode 6 untuk pekerjaan pengembangan yang serius.
Paul R
halo saya mendapatkan kesalahan ini: - *** Kegagalan pernyataan di - [UIApplication _runWithMainScene: transisiContext: penyelesaian:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 bagaimana mengatasi ini
Akash Raghani

Jawaban:

175

Dari pesan kesalahan Anda:

Jendela aplikasi diharapkan memiliki pengontrol tampilan root di akhir peluncuran aplikasi

Berapa umur proyek "lama" ini? Jika sudah lebih dari beberapa tahun, apakah Anda masih memiliki:

[window addSubview:viewController.view];

Anda harus menggantinya dengan:

[window setRootViewController:viewController];
James Webster
sumber
1
Saya memiliki masalah yang sama dan saya pikir ini adalah masalah iOS 9. Proyek saya berfungsi di iOS 7 & 8. Karena alasan tertentu, tampilan dari storyboard tidak disetel dengan benar.
David Snabel-Caunt
3
Terima kasih banyak . jawabannya ada di pesan kesalahan: "Jendela aplikasi" Saya menemukan ada dua jendela dalam proyek saya, satu adalah widdow normal, yang lain adalah modual pihak ketiga bernama
andrew wang
3
MTStatusBarOverlay dan tidak memiliki RootViewController, iOS9 mengharuskan semua Jendela harus memiliki rootViewController.
andrew wang
1
Ya, saya menemukan masalah yang sama, akhirnya. Aplikasi saya memiliki jendela tambahan yang tidak memiliki pengontrol tampilan root.
David Snabel-Caunt
1
Saya telah menemukan solusi yang cocok untuk saya: stackoverflow.com/a/32719949/1881895
barrast
37

Jika Anda telah menyetel rootViewController self.window Anda di delegasi aplikasi dan masih mendapatkan kesalahan ini saat runtime, Anda mungkin memiliki lebih dari satu jendela di UIApplication, salah satunya mungkin tidak memiliki rootViewController yang terkait. Anda bisa melakukan loop melalui jendela aplikasi Anda dan mengaitkan viewController kosong ke rootViewControllernya untuk memperbaiki kesalahan yang Anda dapatkan.

Berikut adalah kode yang mengulang melalui jendela aplikasi dan mengaitkan ViewController kosong ke rootViewController jika tidak ada jendela.

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

Pembaruan: Rupanya ada jendela yang didedikasikan untuk bilah status yang biasanya menyebabkan masalah ini. Kode di atas harus memperbaiki kesalahan ini.

Bms270
sumber
2
Terima kasih!! Ini ternyata menjadi masalah bagi saya. Saya telah mengatur pengontrol tampilan utama, tetapi aplikasi memiliki jendela kedua yang tidak saya sadari.
n13
Sangat solid ... Saya bukan pemula dan yang ini membuat saya saat memperbarui ke Xcode 7.1 menjalankan iOS 9.1 ... bilah status memiliki jendela khusus ... tentu saja ?! Saya menyembunyikan bilah status jika itu berarti bagi siapa pun.
whyoz
Wow, saya memiliki 2 dari 12 aplikasi saya mogok untuk peninjauan Aplikasi dan tampaknya ini memperbaikinya.
Andrew Smith
Bekerja dengan baik !! Gotta love "Rupanya ada jendela yang didedikasikan untuk bilah status yang biasanya menyebabkan masalah ini." TIDAK melihatnya datang.
eGanges
1
Metode ini dapat mengakibatkan viewDidLoad dan viewWillAppear dipanggil dua kali pada rootViewController Anda. Jika Anda memiliki jendela masuk secara manual, periksa plist Anda dan pastikan Anda TIDAK memiliki Window.xib yang didefinisikan sebagai "Nama basis file nib utama" jika Anda melihat hal-hal yang dipanggil dua kali setelah menggunakan solusi ini. Kemudian Anda hanya perlu menghapus kode ini dan setRootViewController seperti biasa.
whyoz
21

XCODE 7 mengharuskan semua Windows harus memiliki rootViewController Anda dapat menggunakan dengan mudah:

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

Ini berfungsi dengan baik jika Anda hanya perlu menggunakan UIWindow (untuk contoh mudah dari Tutorial apa pun - sebelum Xcode 7)!

Utusan
sumber
Selamat datang di Stack Overflow! Harap pertimbangkan untuk mengedit posting Anda untuk menambahkan lebih banyak penjelasan tentang apa yang dilakukan kode Anda dan mengapa itu akan menyelesaikan masalah. Jawaban yang sebagian besar hanya berisi kode (meskipun berfungsi) biasanya tidak akan membantu OP untuk memahami masalahnya.
SuperBiasedMan
Terima kasih, itu menghindari iOS saya ~ 3–8 peringatan => iOS 9 mogok, tetapi memberikan peringatan penganalisis statis tentang kebocoran. Jadi saya memindahkan deklarasi ke antarmuka di header, dengan tugas di applicationDidFinishLaunching. Saya kemudian menambahkan [rilis vc] ke dealloc.
Flash Sheridan
13

Tampaknya sejak iOS 9.1 (?) Atau Xcode 7.1 yang UIWindowdipakai selama application(_:didFinishLaunchingWithOptions:)perlu memiliki satu rootViewControllerset sebelum meninggalkan metode itu.

Sebelumnya cukup hanya jendela utama yang memiliki satu rootViewControllerset selama metode itu. Sekarang setiap UIWindowinstance harus memiliki rootViewControllerproperti yang valid .

Pelaku di sini bisa jadi kode Anda sendiri jika Anda menggunakan UIWindowdan juga pustaka pihak ketiga lainnya yang mencoba menginisialisasi UIWindowcontoh baru selama ini (seperti hamparan pesan bilah status, dll.).

CATATAN : Anda juga mendapatkan kesalahan yang sama jika Anda tidak mengatur rootViewControlerdi jendela utama Anda atau jika storyboard Anda tidak diatur dengan benar. Menyebut ini sebagai catatan tambahan karena kasing tersebut cukup jelas dan mudah untuk diperbaiki.

lipka
sumber
Anda brilian: D, terima kasih man, saya baru saja mengomentari inisialisasi jendela dan semuanya baik-baik saja sekarang
mohammad alabid
3

Ini telah menggigit saya hari ini juga, dan saya membutuhkan beberapa jam untuk memperbaikinya: Aplikasi saya memiliki jendela di "MainWindow.xib", lengkap dengan pengontrol navigasi dan pengontrol tampilan root yang menyertai, yang semuanya secara otomatis dipakai dalam urutan yang benar , dengan Xcode 6 dan iOS8.

Di iOS9, Aplikasi tersebut masih berjalan dengan baik saat diunduh dari AppStore, tetapi tidak saat baru dibuat dengan Xcode 7 dan dijalankan di iOS 9. Pada saat delegasi aplikasi sedang menjalankan metode applicationDidBecomeActive: pengontrol tampilan root sekarang tidak dimuat, karena itu dulu! Itu membuat pengontrol tampilan root melewatkan panggilan ke kode status pemulihan saya.

Saya memperbaikinya dengan membuat instance pengontrol tampilan root sendiri, dalam kode, dan memulihkan statusnya dari viewDidLoad, secara eksplisit.

RickJansen
sumber
2

Anda harus menyetel properti rootviewcontroller setiap jendela di aplikasi Anda

alla
sumber
Jawaban Anda membantu saya
Aznix
2

Saya memiliki proyek lama yang bekerja di iOS 8 tetapi tidak iOS 9. Jika Antarmuka Utama Anda disetel ke MainWindow.xib, perbarui ke storyboard. Ini memperbaikinya untuk saya:

  1. Buat proyek baru, Aplikasi Tampilan Tunggal baik-baik saja.
  2. Salin file Main.storyboard ke proyek Anda, atau Anda bisa membuatnya sendiri.
  3. Buka Pengaturan Proyek Anda dan Atur Antarmuka Utama Anda ke Main.storyboard Setel Antarmuka Utama Anda ke Main.storyboard
Adrian
sumber
1

Cukup setel rootViewController Anda ke navigationController yang merupakan UIViewController Anda di app-delegate.rb seperti kode saya di bawah ini. Saya baru di ruby ​​tetapi harap ini membantu ...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController
BigPun86
sumber
1

Saya mengalami masalah ini dengan aplikasi yang kurang lebih saya warisi. Setelah memverifikasi bahwa storyboard disiapkan dengan benar sebagai antarmuka utama aplikasi dan storyboard memiliki RootViewController, saya masih mengalami error.

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

Apa yang saya temukan setelah penyelidikan lebih lanjut bahwa kecelakaan itu disebabkan oleh beberapa logika tampilan (SVProgressHud) yang dipanggil - (void)applicationDidBecomeActive:(UIApplication *)application. Ini tampaknya menjadi perilaku baru di Xcode7 tetapi sejauh yang saya tahu SVProgressHud mereferensikan rootviewcontroller sebelum ditetapkan oleh storyboard. Terakhir, memperbarui SVProgressHud ke 2.0 telah memperbaiki bug.

Bueno
sumber
0

Solusi Swift 2 yang berhasil untuk saya:

Sisipkan kode di bawah ini di AppDelegate -> didFinishLaunchingWithOptions

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

Fox5150
sumber