Xcode 7, iOS 9 ile bir proje çalıştırırken "Uygulama pencerelerinin uygulama başlatmasının sonunda bir kök görünüm denetleyicisine sahip olması bekleniyor" hatası


89

Fonksiyonu çalıştırdıktan sonra

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

bir çökme var:

 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

Bu proje eski bir proje, Xcode 7 ve iOS 9 ile derlenip çalıştırılması için ne yapmalıyım?


Xcode 7 bir beta olduğundan, herhangi bir ciddi geliştirme çalışması için muhtemelen Xcode 6'ya geri dönmelisiniz.
Paul R.

1
olası Uygulama
Droppy

merhaba şu eroor alıyorum: - *** Onay hatası - [UIApplication _runWithMainScene: transitionContext: complete:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 bu nasıl çözülür
Akash Raghani

Yanıtlar:


175

Hata mesajınızdan:

Uygulama pencerelerinin, uygulamanın başlatılmasının sonunda bir kök görünüm denetleyicisine sahip olması beklenir

Bu "eski" proje kaç yaşında? Birkaç yıldan fazlaysa, hala:

[window addSubview:viewController.view];

Bunun yerine şununla değiştirmelisiniz:

[window setRootViewController:viewController];

1
Aynı sorunu yaşıyorum ve bunun bir iOS 9 sorunu olduğunu düşünüyorum. Projem iOS 7 ve 8'de çalışıyor. Bazı nedenlerden dolayı film şeridinden görünüm doğru ayarlanmamış.
David Snabel-Caunt

3
Çok teşekkür ederim . cevap hata mesajında: "Uygulama pencereleri" Projemde iki pencere olduğunu görüyorum, biri normal widdow, diğeri ise üçüncü taraf bir modual
andrew wang

3
MTStatusBarOverlay ve RootViewController'a sahip değil, iOS9 tüm Window'un bir rootViewController'a sahip olmasını gerektirir.
Andrew

1
Evet, sonunda aynı sorunu buldum. Uygulamamda, kök görünüm denetleyicisine sahip olmayan ek bir pencere var.
David Snabel-Caunt

1
Benim için işe
yarayan

37

Uygulama temsilcinizdeki self.window'unuzun rootViewController'ını zaten ayarladıysanız ve bu hatayı çalışma zamanında almaya devam ediyorsanız, muhtemelen UIApplication'ınızda biri rootViewController ile ilişkilendirilmiş olmayan birden fazla pencereniz vardır. Uygulama pencerelerinizde döngü oluşturabilir ve aldığınız hatayı düzeltmek için boş bir viewController'ı rootViewController ile ilişkilendirebilirsiniz.

İşte uygulama pencereleri arasında döngü yapan ve bir pencere eksikse boş bir ViewController'ı rootViewController ile ilişkilendiren bir kod.

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

Güncelleme: Görünüşe göre bu soruna neden olan durum çubuğuna ayrılmış bir pencere var. Yukarıdaki kod bu hatayı düzeltmelidir.


2
Teşekkürler!! Bu benim için sorun oldu. Ana görünüm denetleyicisini ayarlamıştım, ancak uygulamanın farkında olmadığım ikinci bir penceresi vardı.
n13

Çok sağlam ... Çaylak değilim ve bu beni iOS 9.1 çalıştıran Xcode 7.1'e güncelleme yaparken yakaladı ... durum çubuğunun ayrılmış bir penceresi var ... elbette öyle mi ?! Herhangi biri için bir şey ifade ediyorsa, durum çubuğunu saklıyorum.
whyoz

Vay be, 12 uygulamamdan 2'si Uygulama incelemesi için çöküyordu ve bu sorunu düzeltti.
Andrew Smith

Harika çalıştı !! Sevmeliyim "Görünüşe göre bu soruna neden olan durum çubuğuna ayrılmış bir pencere var." Bunun geldiğini görmedim.
eGanges

1
Bu yöntem, rootViewController'ınızda viewDidLoad ve viewWillAppear'ın iki kez çağrılmasına neden olabilir. El ile başlatma pencereniz varsa, bu geçici çözümü kullandıktan sonra iki kez çağrılan şeyler görüyorsanız, plistinizi kontrol edin ve Window.xib'in "Ana uç dosyası temel adı" olarak tanımlanmadığından emin olun. O zaman bu kodu kaldırmanız ve normalde yaptığınız gibi setRootViewController yapmanız yeterlidir.
whyoz

21

XCODE 7, tüm Windows'un bir rootViewController'a sahip olmasını gerektirir Kolay kullanabilirsiniz:

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

Yalnızca UIWindow kullanmanız gerekiyorsa iyi çalışıyor (herhangi bir Öğreticiden kolay örnekler için - Xcode 7'den önce)!


Stack Overflow'a hoş geldiniz! Lütfen kodunuzun ne yaptığı ve sorunu neden çözeceği hakkında daha fazla açıklama eklemek için yayınınızı düzenlemeyi düşünün. Çoğunlukla sadece kod içeren bir cevap (çalışıyor olsa bile) genellikle OP'nin problemlerini anlamasına yardımcı olmaz.
SuperBiasedMan

Teşekkürler, bu benim iOS ~ 3–8 uyarısı => iOS 9 çökmesini önledi, ancak bir sızıntı hakkında statik analizci uyarısı verdi. Bu yüzden bildirimi applicationDidFinishLaunching'deki atamayla birlikte başlıktaki arabirime taşıdım. Daha sonra dealloc'a [vc release] ekledim.
Flaş Sheridan

13

Görünüşe göre iOS 9.1 (?) Veya Xcode 7.1'den bu yana, bu yöntemden ayrılmadan önce herhangi bir sırada UIWindowörneklenen herhangi application(_:didFinishLaunchingWithOptions:)bir rootViewControllersetin olması gerekiyor .

Önceden, rootViewControllerbu yöntem sırasında yalnızca ana pencerenin ayarlanması yeterliydi . Artık herhangi bir UIWindowörneğin geçerli bir rootViewControllerözelliğe sahip olması gerekir .

Buradaki suçlu, kendi kodunuz olabilir UIWindowve ayrıca UIWindowbu süre içinde yeni bir örneği başlatmaya çalışan herhangi bir üçüncü taraf kitaplığı (durum çubuğu mesaj kaplamaları vb.) Olabilir.

NOT : rootViewControlerAna pencerenizde ayarlamazsanız veya film şeridiniz doğru ayarlanmamışsa da aynı hatayı alırsınız . Bundan bir yan not olarak bahsetmek, çünkü bu durumlar oldukça açık ve düzeltilmesi basittir.


Harikasın: D, teşekkürler dostum sadece pencerenin başlatılmasını
yorumluyorum

3

Bu beni bugün de ısırdı ve düzeltmem birkaç saate mal oldu: Uygulamamın penceresi, gezinme denetleyicisi ve ona eşlik eden kök görünüm denetleyicisi ile birlikte bir "MainWindow.xib" dosyasında bulunuyor ve bunların tümü otomatik olarak uygun sırada başlatılıyor , Xcode 6 ve iOS8 ile.

AppStore indirilen zaman, ancak Uygulama hala cezası çalıştığını iOS9 günü değil kök görünümü denetleyicisi şimdi yöntemi: Yeni uygulama temsilci onun applicationDidBecomeActive çalıştırdığı dönemde Xcode 7 ile inşa edilmiş ve iOS 9. yayınlandığında değil yüklenen bunun gibi önceden öyleydi! Bu, kök görünüm denetleyicisinin geri yükleme durumu koduma yapılan çağrıyı kaçırmasına neden oldu.

Bunu, kök görünüm denetleyicisini kodda kendim başlatarak ve durumunu viewDidLoad'dan açıkça geri yükleyerek düzelttim.


2

Uygulamanızda her pencerenin rootviewcontroller özelliğini ayarlamalısınız


Cevabınız bana yardımcı oldu
Aznix

2

İOS 8'de çalışan ancak iOS 9'da çalışmayan eski bir projem var. Ana Arayüzünüz MainWindow.xib olarak ayarlandıysa, onu bir storyboard'a güncelleyin. Bu benim için düzeltti:

  1. Yeni bir proje oluşturun, Tek Görünümlü Uygulama iyidir.
  2. Main.storyboard dosyasını projenize kopyalayın veya kendinizinkini oluşturabilirsiniz.
  3. Proje Ayarlarınızı açın ve Ana Arayüzünüzü Main.storyboard'a ayarlayın Ana Arayüzünüzü Main.storyboard'a ayarlayın

1

RootViewController'ınızı aşağıdaki kodum gibi app-delegate.rb'deki UIViewController'ınız olan navigationController'a ayarlayın. Ruby'de yeniyim ama umarım bu yardımcı olur ...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

1

Bu konuya daha az miras aldığım bir uygulama ile geldim. Film şeridinin uygulama ana arayüzü olarak düzgün bir şekilde kurulduğunu ve film şeridinin bir RootViewController'a sahip olduğunu doğruladıktan sonra hala çökmeyi alıyordum.

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

Biraz daha araştırdıktan sonra, çökmenin çağrılan bazı görünüm mantığından (SVProgressHud) kaynaklandığını keşfettim - (void)applicationDidBecomeActive:(UIApplication *)application. Bu, Xcode7'de yeni bir davranış gibi görünüyor, ancak söyleyebileceğim kadarıyla SVProgressHud, storyboard tarafından ayarlanmadan önce rootviewcontroller'a başvuruyordu. Sonuçta SVProgressHud'u 2.0'a güncellemek hatayı düzeltti.


0

Benim için çalışan Swift 2 çözümü:

Aşağıdaki kodu AppDelegate -> didFinishLaunchingWithOptions'a ekleyin

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.