Uygulama başlatıldığında uygulamaların bir kök görünüm denetleyicisine sahip olması beklenir


383

Konsolumda şu hatayı alıyorum:

Uygulama başlatıldığında uygulamaların bir kök görünüm denetleyicisine sahip olması beklenir

Aşağıda benim application:didFinishLaunchWithOptionsyöntemim:

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

    // Set Background Color/Pattern
    self.window.backgroundColor = [UIColor blackColor];
    self.tabBarController.tabBar.backgroundColor = [UIColor clearColor];
    //self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"testbg.png"]];

    // Set StatusBar Color
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];

    // Add the tab bar controller's current view as a subview of the window
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

Interface Builder'da, UITabBarController'temsilci Uygulama Delegesi'ne bağlanır.

Bu sorunu nasıl çözeceğinizi bilen var mı?


5
Atamayı yapmadan hemen önce bir NSLog self.tabBarController yapın. İleti yalnızca denetleyici sıfırsa tetiklenir. Sıfırsa ve bağlantılarınızın doğru olduğundan emin olduysanız, denetleyiciyi kodda somutlaştırmayı deneyin.
FeifanZ

Pencerenin başlatılmasını yorumlamaya çalışın .. bu cevabı kontrol edin stackoverflow.com/a/33958144/1293445
mohammad alabid

Yanıtlar:


188

Aynı sorunu yaşadım. Ana cihazınızı kontrol edin. M. Son bağımsız değişken, UIApplicationDelegate protokolünü uygulayan sınıfın adına ayarlanmalıdır.

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");

49
Başka bir seçenek, uygulama delege sınıfının ana ve kullanımda içe aktarıldığından emin olmaktır NSStringFromClass. Xcode şimdi main.m dosyasını böyle oluşturur. Örneğin: #import "AppDelegate.hve sonraint retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
sho

10
emin olun self.windowgibi başlatıldıself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor

1
Yukarıdaki seçenekleri denedim, benim için çalışmadı. Ve bir Öykü Paketi kullanmıyorum.
jowie

3
Benim için bir etkisi olmadı, değişikliği yaptıktan sonra aynı "Uygulamalar bekleniyor ..." mesajı. Çözüm OrdoDei'nin mükemmel çalışan cevabı (yukarıya veya aşağıya bakınız) idi.
Andrew

1
Simülatörde beyaz bir görünüm görürseniz ancak bir film şeridinden düzeni görmeniz bekleniyorsa, kök delege işlevindeki koddan kurtulduğunuzdan emin olun. EVET;" içinde.
Olivier de Jonge

435

AppDelegate'te değiştir

 [window addSubview:[someController view]];

için

  [self.window setRootViewController:someController];

Bu benim için mesajdan kurtuldu. Hala bir sonraki pencere göstermiyor, ancak bu farklı bir sorun olabilir. Teşekkürler.
Jazzmine

3
Bir UINavigationController kullanıyorsanız öncelikle [[UINavigationController] initWithRootViewController: tableViewController] olmalıdır: pencerenin kök görünümü denetleyicisi ayarlamak için [self.navigationController self.window setRootViewController] ve yukarıdaki kodu kullanmak
emdog4

Cocos2d'de "// AddSubView iOS6'da çalışmıyor" yazan bir yorum var. Bu yüzden iOS 6'yı kullandığım için bu benim için düzeltildi
Almo

1
addSubviewHat Xcode / iOS SDK erken sürümüne proje şablonun bir parçası oldu. Uygulama uzun bir yoldan giderse, yazmasanız bile uygulayabilirsiniz.
Seva Alekseyev

merhaba ben bu eroor alıyorum: - *** - [UIApplication _runWithMainScene: passContext: completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 bunu nasıl çözebilirim
Akash Raghani

70

Yüklü olan ilk görünüm denetleyicisini değiştirmeye çalışırken aynı hatayla karşılaştım

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

İlk başta hatanın nereden geldiğini gerçekten bilmiyordum, bu yüzden daralttım ve neyin yanlış gittiğini öğrendim. Görünüşe göre aslında ekrana gelmeden önce bir görüntünün görüntüsünü değiştirmeye çalışıyordum. Bu yüzden çözüm, bana sorun veren viewcontroller'da bu kodu taşımaktı.

- (void)viewDidLoad

için

- (void)viewDidAppear:(BOOL)animated

ve hata görünmüyor. Benim sorunum özellikleUIAlertView gösteri .

Sizin durumunuzda, tabBarController'ın aktif görünüm denetleyicisindeki kodu kontrol etmenizi öneririm (muhtemelen bu görünüm denetleyicisinde bir sorun olduğu için). Bu işe yaramazsa, başlangıç ​​ayarlarını kod yerine nib dosyasında ayarlamayı deneyin - veya kodda yapmak istiyorsanız, kodu tabBarController'ın etkin viewcontroller'ın uygun yöntemine taşımayı deneyin.

İyi şanslar!


1
Warkst, cevap için teşekkürler. Benim durumumda, viewDidLoad:(bayrak eklemeden) kodu dışarı taşıyamam , ne de bunu yapmak gerekir. Ne olursa olsun, öneri için teşekkürler!
ArtSabintsev

2
Bugün buldum ve yaptığım sevindim - aynı sorun - bir uialert viewDidLoad lansmanı gösteriyordu. ViewDidAppear olarak değiştirildi ve iyi çalışıyor. İOS5'te bunu değiştirerek Apple'ın daha iyi ne elde ettiğinden emin değilim.
GuybrushThreepwood

Uyarı görünümünün buna neden olduğu önerisi için teşekkürler, aynı sorun bana da oldu.
Chris

1
Sıralamak için hangi kodu kaldırmanız gerektiğini söyleyebilir misiniz? Ben viewDidLoadbirçok şey için kullanıyorum , veri eklemek gibi tüm ilk kez şeyler kurmak UITableView. Ben bunu hareket edemez viewDidAppear:Ben sadece bir kez ateş istiyorum çünkü.
jowie

1
Sorun yanlış işlev değildi. Sorun, viewDidLoad işlevinizde [super viewDidLoad] 'u çağırmayı unutmuş ve uç yükünü etkili bir şekilde öldürmüş olmanızdı. Aynı şey başıma birden fazla kez geldi.
borrrden

47

Bunu "Boş Uygulama" şablonu ile başlayıp sonra elle bir XIB eklerken aldım. Sunny'nin önerdiği ana Nib adını ayarlayarak çözdüm. Bu senaryoda eksik adım kaldırılıyor

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

itibaren

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

Xib dosyasında oluşturulan pencerenizin örneğinin üzerine yazacağı için. Bu, bir ViewController oluşturduğunuzu ve pencereniz ve App Delegate ile XIB dosyasında bağladığınızı varsayar.


Bu benim için de düzeltildi. CoreData eklemeye çalıştığım bir Storyboard ile Sekmeli bir uygulama kullanıyordum ve bu soruna koştum.
gitaarik

Bunu eklerseniz lol Uygulama pencerelerinin bir kök görünüm denetleyicisi olması bekleniyor iki uyarı almak !!
George Asda

46

Bu bana oldu. .Plist dosyasını düzenleyerek çözüldü. Ana uç dosyası taban adını belirtin (MainWindow.xib olmalıdır). Umarım bu yardımcı olur.

resim açıklamasını buraya girin


2
Bu benim için çalıştı! Bu, Maincode'un bulunmayacağı Xcode 4.2'de boş bir proje oluşturduğunuzda ve bunu nasıl bağlamamız gerektiğinde çalışır.
jeevangs

Sorun, istemeden 'Ana uç dosya tabanı adı' satırını 'Info.plist' dosyasından sildiğimizde oldu. Bu satırı tekrar eklemek sorunu çözdü.
rtovars

Bunu proje özelliklerinde de ayarlayabilirsiniz. Projeyi seçin, hedefiniz, bunu Özet -> iPhone / iPad Dağıtımı bilgilerinde düzenleyebilirsiniz.
doekman

Bu aslında benim için sorun oldu, rootViewController üzerinde iki kez viewDidLoad ve viewWillAppear'ı çağırmayla ilgili birçok soruna yol açtı. Benim durumumda bu çözüm kaldı
1616

27

Son zamanlarda ios5 sdk ile bir proje oluştururken aynı problemle karşılaşıyorum. İlk başta düzgün bir şekilde inşa edildi ve çalışıyordu, ancak bundan sonra hata ortaya çıktı.
Benim durumumda çözüm oldukça basitti.
Eksik olan, bir şekilde uygulama hedefimin özet sekmesindeki Ana Arayüz özelliğinin silinmiş olmasıydı . Bu yüzden tekrar ayarlamam gerekiyordu.


Bu nokta değilse ve tabBarController hala sıfırsa, her zaman programlı olarak pencere ve kök denetleyicinizi oluşturabilirsiniz. Bir yedek olarak projeme aşağıdaki kodu ekledim

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ 
    if (!window && !navigationController) {
        NSLog(@"Window and navigation controller not loaded from nib. Will be created programatically.");
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        UIViewController *viewController1, *viewController2;
        viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
        viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];

        self.tabBarController = [[[UITabBarController alloc] init] autorelease];
        self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
        self.window.rootViewController = self.tabBarController;

    }
    else {
        [window addSubview:[tabBarController view]];
    }
    [self.window makeKeyAndVisible];
    return YES;
}

Bu sadece sho'nun çözümü de uygulandığında çalışır.


24

İOS9'a geçtim ve bu hatayı hiçbir yerden almaya başladım. Düzeltmeyi başardım ama aşağıdaki kodu ekleyerek- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

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

Uygulamanızın kaç pencereye sahip olduğunu ve hepsinin bir kök görünüm denetleyicisine sahip olup olmadığını merak ediyorum. Teşekkürler
DrAL3X

5
Not : Bu yanıt bir geçici çözümdür ve kök nedenini düzeltmez. Bkz. Stackoverflow.com/a/33958144/1116061
lipka

Sen gerçek bir kahramansın!
user2161301

21

Yukarıdaki önerilerin hiçbiri sorunumu çözmedi. Benimki şuydu:

Ekle:

window.rootViewController = navigationController;

sonra:

[window addSubview:navigationController.view];

benim appdelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {

20
  • Nib Dosyanızda "Pencerenizi" seçin
  • "Özellik Denetçisi" nde "Lansmanda Görünür" seçeneğini işaretleyin

görüntü! []

  • Bu, uç dosyanız elle oluşturulduğunda gerçekleşir.
  • Bu düzeltme normal uç modu için çalışır - film şeridi modu için değil

Bu sadece Storyboard Modunda bulunur, sanırım.
ArtSabintsev

Hayır, bu proje düzenli uç moduydu. Bu Storyboard Mode'dan bir ekran görüntüsü. "Başlatıldığında Görünür" ve "Başlangıç ​​Görünümü Denetleyicisidir".
bearMountain

3
Pencere ucu dosyası el ile oluşturulmuşsa ve "Başlatıldığında görünür" seçeneği işaretlenmemişse, uygulama başlatıldıktan sonra bu iletiyi ister, bu sorunumu giderir!
ZYiOS

OHH, TEŞEKKÜRLER!!! Son olarak, bu can sıkıcı uyarıya bir çözüm. Sahip olsanız bile makeKeyAndVisiblesorunu çözmez. SADECE bu uyarıyı benim için çözdü. TEŞEKKÜR EDERİM!
tacos_tacos_tacos

'Bu normal uç modunda gerçekleşiyor - film şeridi modunda değil` Çok doğru değil. Ben aynı sorunla karşı karşıya am Storyboardda
thesummersign

19

iOS5 için RootViewController nasıl eklenir

uygulamanız şimdiye kadar bir RootViewController kullanmadıysa, Dosya> Yeni> Yeni Dosya'ya basarak bir tane oluşturun;); RootViewControllerUIViewController subclass adını seçin , Kullanıcı arabirimi için XIB ile (zaten bir tane olduğunu varsayarak) işaretini kaldırın ve bu kodu AppDelegate :: didFinishLaunchingWithOptions içine koyun

rootViewController = [[RootViewController alloc] init];
window.rootViewController = rootViewController;

kesin - RootViewController.h dosyasını içe aktarmanız ve değişkeni oluşturmanız gerekir

İşte RootViewController ve AppDelegate hakkında güzel bir makale ,


Cupsofcocoa.com makale bağlantısı öldü - bir yerde bir kopya varsa herhangi bir fikir?
Ríomhaire

1
Bu binpress.com'a taşındı, cevaptaki bağlantıyı güncelledi
rémy

Bu harika bir bağlantı. İyi okuma ve neler olduğunu açıklar. Ben sadece eski bir kitap kullanarak bu sorunla karşılaştım (ilk önce Objective-C öğrenmek istiyorum) ama eski şablonları olmayan en son XCode 7 kod yazma.
ibaralf

11

Ben de bu hatayı vardı ama daha önce listelenen cevaplar aksine benim yeni oluşturulan denetleyicisi (xcode 4.2, ios5) yöntemi 'loadView' uncommented çünkü oldu.

 //Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView  
{
}

Hatta yöntem programlı görünüm oluşturmak için olduğunu söyledi ama normalde ben onu yakalamak vermedi viewDidLoad gibi diğer yöntemlere benziyordu çünkü ben özledim.

Çözmek için, nib veya storyboard kullanarak görünüm hiyerarşisini programlı olarak oluşturmuyorsanız, bu yöntemi kaldırın.


Bunun soruna neden olabileceğini onaylayabilirim. LoadView delegeleri ayarlamak oluşturdukları TableView hakkında öğretici izleyerek aynı durum vardı. Bu kodu viewDidLoad öğesine taşıdıktan ve loadView kaldırdıktan sonra, her şey gerektiği gibi çalışmaya başladı.
Eugen

Yine de yük görünümünü kullanabilirsiniz ancak [super loadView] ekleyin; başında.
Hermann Klecker

1
Hmm ... loadView belgeleri özellikle süper yöntemi çağırmamanız gerektiğini belirtir.
Joshua Sullivan

Bir hikaye tahtasında varsayılan UIViewController overrode ve bir UIViewController alt sınıf oluşturmak için şablon kodunun varsayılan olarak bu bana neden neden loadView etkin bulundu ... bu aptalca şey üzerinde bir saatten fazla boşa. Bunu gönderdiğiniz için teşekkürler!
12'de slycrel

11

Bende bu problemler var. Projemi xcode4.2.1'de çalıştırdım. Orada tüm yorumları okudum, ama kimse benim için havalı değil. Bir süre sonra, ben bir kod parçası yorumladı bulmak.

//self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

sonra ben uncommented. benim için herşey yolunda. Umarım bu sizin için yararlı olur.


Kod: "self.window = [[UIWindow ayırma] initWithFrame: [[UIScreen mainScreen] sınırları]];" bir hataya neden oldu, bu yüzden sadece sildim.
Grigori A.

11

Uygulama temsilcinizde bu işleve sahip olduğunuzdan emin olun.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions {
   return YES;
}

DidFinishLaunchingWithOptions öğesinin YES döndürdüğünden emin olun. 'Dönüş EVET' satırını kaldırırsanız, bu hataya neden olur. Bu hata özellikle storyboard kullanıcıları için yaygın olabilir.


birçok kudos, istediğim bu (film şeridi ile boş proje)
Shtirlic

2
Burada aynı. Teşekkürler. Boş uygulama oluşturursanız, bu yöntem pencerenin manuel olarak oluşturulmasıyla doldurulur. Bu sadece YES döndürmek için değiştirilmelidir. Teşekkürler
Ben G

10

İlk görüşümle MenuViewControllerşunları ekledim:

MenuViewController *menuViewController = [[MenuViewController alloc]init];
self.window.rootViewController = menuViewController;

Uygulama Temsilcisi yönteminde:

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

İşe yaradı.


10

İOS 5.0 veya benzeri sürümlerde, kök görünüm denetleyicisine sahip olmanızı gerektiren küçük bir değişiklik oldu. Kodunuz GLES2Sample gibi eski örnek kodlara dayanıyorsa , bu kod örneklerinde kök görünüm denetleyicisi oluşturulmamıştır.

Düzeltmek için (örneğin, bu GLES2Sample), applicationDidFinishLaunchingbir kök görünüm denetleyicisi oluşturup glView'imi buna ekliyorum.

- (void) applicationDidFinishLaunching:(UIApplication *)application
{
  // To make the 'Application windows are expected
  // to have a root view controller
  // at the end of application launch' warning go away,
  // you should have a rootviewcontroller,
  // but this app doesn't have one at all.
  window.rootViewController = [[UIViewController alloc] init];  // MAKE ONE
  window.rootViewController.view = glView; // MUST SET THIS UP OTHERWISE
  // THE ROOTVIEWCONTROLLER SEEMS TO INTERCEPT TOUCH EVENTS
}

Bu, uyarıyı ortadan kaldırır ve uygulamanızı gerçekten etkilemez.


9

Sekme çubuğu denetleyicisinin IBOutlet'ini Arabirim Oluşturucu'da kök görünümüne bağlamak yerine

self.window.rootViewController = self.tabBarController;

Ama aslında daha önce böyle bir hata görmedim.


8

Sorunu aşağıdakileri yaparak çözdüm (yukarıdaki diğer çözümlerin hiçbiri yardımcı olmadı):

"Ana Arayüz" ile ilişkili açılır menüden başka bir giriş seçin ve "MainWindow" seçimini tekrar yapıp yeniden oluşturun.

resim açıklamasını buraya girin


8

Aynı sorunla karşılaştım ama storyboard

Penceremin storyboard InitialViewControllerpencerelerine atama rootViewController.

İçinde

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
UIStoryboard *stb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
self.window.rootViewController = [stb instantiateInitialViewController];
return YES;
}

ve bu sorunu çözdü.


7

Aynı sorunu Xcode 4.3'e yükselttikten hemen sonra başladım ve sadece bir projeyi sıfırdan başlatırken (yani boş proje oluştur, sonra bir UIViewController oluştur ve sonra ayrı bir uç dosyası oluştur).

TÜM satırları koyduktan ve doğru bağlantılara sahip olduğumdan emin olduktan sonra, bu hatayı almaya devam ettim ve görünüm denetleyicisinden (rootController olarak ayarlandı) yüklemeye çalıştığım uç dosyası simülatörde hiç gösterilmedi.

Xcode aracılığıyla tek bir görünüm şablonu oluşturdum ve kodumla karşılaştırdım ve Nihayetinde sorunu buldum!

Xcode 4.3 varsayılan olarak - (void) loadView yöntemini ekliyor gibi görünüyor; görünüm denetleyicisi uygulama bölümüne gidin. İçindeki yorumları dikkatlice okuduktan sonra sorunun ne olduğu netleşti. Yorum, programlı bir görünüm oluştururken loadView yöntemini geçersiz kıldığı belirtiliyor (ve yorum yapıyorum), aksi takdirde bir uç kullanılıyorsa loadView'i geçersiz kılmak için DEĞİLDİR. Bu yöntemin içinde başka bir şey yoktu, bu yüzden duygulanımda hatayı veren bir uç dosyası kullanarak yöntemi geçersiz kılıyordum (ve hiçbir şey yapmıyordum).

ÇÖZÜM, loadView yöntemini uygulama bölümünden tamamen kaldırmak veya [super loadView] ekleyerek üst yöntemi çağırmaktı.

Başka bir kod eklemek için bir NIB dosyası kullanıldığında bu geçersiz kılınır.


bu benim sorunumdu! Bir loadView uygulaması ekledim ama süper çağırmadım. Başka kod değişiklikleri yaptı, ne halt yaptığımı hatırlayamıyordum. 2 saat boyunca sıkışıp kaldım çünkü bu değişiklik çok zararsız görünüyordu.
LearnCocos2D

6

Günlükte aynı hata iletisini aldım. Uygulamada bir UIAlertView açılır vardı: didFinishLaunchingWithOptions. Kök görünüm denetleyicisinin yüklemeyi bitirmesi için zaman tanımak için alertView çağrısını geciktirerek çözdüm.

Uygulamada: didFinishLaunchingWithOptions:

[self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0];

1 saniye sonra arama:

- (void)callPopUp
{
    // call UIAlertView
}

Teşekkürler, bu sorunumu çözdü. Pencere yükleninceye kadar uyarıyı göstermek için beklemeniz gerekir. Benim durumumda az önce [alert performSelector: @selector (show) ileObject: nil afterDelay: 1.0];
deepwinter

6

Ben de aynı problemi yaşadım. Benim gibi "sıfırdan" bir pencere tabanlı uygulama oluşturuyorsanız, aşağıdakileri yapmanız gerekir: (not, bunlar Xcode 4.2 için adımlar.)

0. Uygulama temsilcinizin UIApplicationDelegate protokolüne uygun olduğundan emin olun.

Örneğin, temsilcimize MyAppDelegate adı verildiğini varsayalım. MyAppDelegate.h dosyasında şöyle bir şey olmalı:

@interface MyAppDelegate : 
    NSObject <UIApplicationDelegate> // etc...

1. Uygulama temsilcisini main.m dosyasında belirtin.

Örneğin,

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
  @autoreleasepool {
    return UIApplicationMain(argc, argv,
      nil, NSStringFromClass([MyAppDelegate class]));
  }
}

2. Bir ana pencere arayüz dosyası oluşturun.

Bunu yapmak için projenizi sağ tıklayın ve Yeni Dosya'yı seçin. Oradan, iOS -> Kullanıcı Arayüzü bölümünden Pencere'yi seçin.

Dosyayı projenize ekledikten sonra, projenin özetine gidin (projeye sol tıklayın; özeti tıklayın.) İPhone / iPod Dağıtım Bilgisi (ve isterseniz ilgili iPad bölümü) altında " Ana Arabirim "birleşik giriş kutusu.

3. Arayüz düzenleyicisine hepsini takın

Arayüz düzenleyiciyi getirmek için dosya listesinden arayüz dosyanızı seçin.

Yardımcı Programlar bölmesinin açık olduğundan emin olun.

İzlenceler bölmesindeki Nesneler listesinden bir Nesneyi Pencere nesnenizin altındaki boşluğa sürükleyerek yeni bir Nesne ekleyin. Nesneyi seçin. Yardımcı Programlar bölmesinde Kimlik denetçisine tıklayın. Sınıfı uygulamanın temsilcisine değiştirin (bu örnekte Uygulamam).

MyAppDelegate için bağlantı denetçisini açın. Pencere çıkışını, arayüz dosyasında bulunan Pencereye bağlayın.

Soldaki Dosya Sahibine tıklayın ve ardından Yardımcı Programlar bölmesinde Kimlik denetçisine tıklayın. Sınıfı olarak değiştirUIApplication

Dosya Sahibi için bağlantı denetçisini açın. Temsilci çıkışını MyAppDelegate nesnesine bağlayın.

4. Son olarak ve en önemlisi, arayüz dosyasındaki Window nesnesine tıklayın. Özellikler denetçisini açın. "Lansmanda Görünür" seçeneğinin işaretli olduğundan emin olun.

Benim için çalışması için tek yapmam gereken buydu. İyi şanslar!


6

MTStatusBarOverlay kullanıyorsanız, bu hatayı alırsınız.

MTStatusBarOverlay, bir kök denetleyicisi olmayan ek bir pencere ([[UIApplication sharedApplication] pencereleri) oluşturur.

Bu bir soruna yol açıyor gibi görünmüyor.


Bundan emin misin? Test ettin mi?
Sergey Grischyov

Eminim bir pencere oluşturur ve uygulamalarımda sorun yaratmadığından eminim.
Karışık Vorlon

Bunu düzeltmek için MTStatusBarOverlay'e bir sahte VC ayarlayabilirsiniz.
Wesley

Bu benim sorunumdu. Bildirim çubuğu için eklenen bir pencere ile benzer bir tür kurulum vardı ve bir kez hata kayboldu yorumladı! Bu durumda zararsız gibi görünüyor.
Aaron Zinman

6

Kullanıcı arayüzümü XCode 4.6.3 ve iOS 6.1 kullanarak bir Storyboard ile değiştirdikten sonra aynı hatayı aldım

AppDelegate'teki didFinishLaucnhingWithOptions içindeki tüm kodu temizleyerek çözdüm

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}

5

OrdoDei doğru ve değerli bir cevap verdi. Bu yanıtı yalnızca yanıtı didFinishLaunchingWithOptionskullanan bir yöntemin bir örneğini vermek ve Gezinti Denetleyici ile ilgili diğerlerinin yorumlarını hesaba katmak için ekliyorum .

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    // Instantiate the main menu view controller (UITableView with menu items).
    // Pass that view controller to the nav controller as the root of the nav stack.
    // This nav stack drives our *entire* app.
    UIViewController *viewController = [[XMMainMenuTableViewController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    // Instantiate the app's window. Then get the nav controller's view into that window, and onto the screen.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // [self.window addSubview:self.navigationController.view];
    // The disabled line above was replaced by line below. Fixed Apple's complaint in log: Application windows are expected to have a root view controller at the end of application launch
    [self.window setRootViewController:self.navigationController];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

4

Yanlışlıkla yorum yaptım çünkü bu benim için meydana geldi:

[self.window makeKeyAndVisible];

itibaren

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

4

İlk görünüm denetleyicisini xcode özet ekranında ayarlayabildim.

Sol dosya gezgininde en üstteki proje adına tıklayın (küçük bir plan simgesine sahip olmalıdır). Orta sütunda 'HEDEFLER' altındaki proje adınızı tıklayın (yanında küçük bir 'A' simgesi olmalıdır). 'İPhone / iPod Dağıtım Bilgisi' altına bakın ve 'Ana Arayüz' konusuna bakın. Açılır menüden bir seçenek belirleyebilmeniz gerekir.


4

"Sho" cevabının üstüne, bu doğru (UIApplicationMain'in dördüncü parametresi ana kontrolörün adı olmalıdır), bazı yorumlar ekliyorum.

Kısa bir süre önce bir uygulamanın 'modelini' programlı bir pencere oluşturmak için MainWindow.xib kullanarak değiştirdim. Uygulama, bu MainWindow'u otomatik olarak oluşturan daha eski bir şablon kullandı. İPhone 5 için farklı bir denetleyici görünümü XIB'yi desteklemek istediğim için, Uygulama Temsilcisi oluşturulduğunda programlı olarak doğru XIB'yi seçmek daha kolay. MainWindow.xib projeden de kaldırdım.

Sorun, UIApplication main dördüncü parametre doldurmayı unuttum ve proje özeti, "Main Interface" MainWindow kaldırmak için UNUTMAK.

Bu BÜYÜK bir soruna neden oldu: geliştirme cihazlarında "Uygulamalar bekleniyor ..." zararsız uyarısı verdi, ancak App Store'a gittiğinde, MainWindow artık pakette olmadığı için çökerek tüketici telefonlarında kırıldı! Bugfix için hızlandırılmış bir inceleme istemek zorunda kaldı.

Başka bir belirti, bazen boş bir UIView gibi beyaz bir bloğun bazen Ayarlar değiştirildiğinde ve uygulamanın ön plana çıkarıldığı zaman ortaya çıkmasıdır. İPhone 5'te bunun 320x480 blok olduğu açıktı. Belki de eksik MainWindow, eski boyut kullanılarak geliştirme modunda oluşturuluyordu. Çöküşün ilk raporları gelen kutusuna ulaştığında bu hatayı buldum.

Uygulamayı XCode yerine App Store'dan yüklemek, uygulamanın gerçekten çöktüğünü gösterdi ve MainWindow sorunu günlükte kendini gösterdi, bu yüzden cihazların + IOS sürümlerinin özel bir kombinasyonu olmadığını görebiliyordum.


4

Mike Flynn'in cevabına eklemek için, Xcode 7'ye yükseltip uygulamamı bir iOS 9 cihazında çalıştırdığından, bunu (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

// Hide any window that isn't the main window
NSArray *windows = [[UIApplication sharedApplication] windows];
for (UIWindow *window in windows) {
    if (window != self.window) {
        window.hidden = YES;
    }
}

Uygulamanızın kaç pencereye sahip olduğunu ve hepsinin bir kök görünüm denetleyicisine sahip olup olmadığını merak ediyorum. Teşekkürler
DrAL3X

3

Arabirim Oluşturucu doğru şekilde ayarlanmadığında bu sorun oluşur.

Uygulama Temsilcinizin penceresinin ve viewController çıkışlarının bağlandığından emin olun:

MainWindow.xib'inizde kontrolü basılı tutun, Uygulama Temsilcisi'ni tıklatın ve Window nesnesine sürükleyin. Pencereyi seçin. Kontrolü basılı tutun ve Uygulama temsilcisini tekrar seçin, kök görünüm denetleyicinize sürükleyin ve viewController'ı seçin.


3

Bu hata, MainWindow.xib dosyasının sahibi yanlış ayarlandığında da gösterilir.

Dosyanın sahibi UIApplication
-> pencere çıkışı pencereye bağlıyken uygulama temsilci sınıfının eklenen nesnesi


Manuel olarak bir xib dosyası oluşturdum ve bu hatayı almaya başladım. çok teşekkürler!
RawMean
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.