Aplikasi diharapkan memiliki pengontrol tampilan root pada akhir peluncuran aplikasi

383

Saya mendapatkan kesalahan berikut di konsol saya:

Aplikasi diharapkan memiliki pengontrol tampilan root pada akhir peluncuran aplikasi

Di bawah ini adalah application:didFinishLaunchWithOptionsmetode saya :

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

Di Interface Builder, UITabBarControllerdelegasi terhubung ke App Delegate.

Adakah yang tahu cara memperbaiki masalah ini?

ArtSabintsev
sumber
5
Lakukan NSLog dari self.tabBarController tepat sebelum Anda melakukan tugas. Pesan hanya terpicu jika pengontrolnya nol. Jika nihil, dan Anda memastikan koneksi Anda benar, coba instantiating controller dalam kode.
FeifanZ
coba komentari inisialisasi Window .. periksa jawaban ini stackoverflow.com/a/33958144/1293445
mohammad alabid

Jawaban:

188

Saya punya masalah yang sama. Periksa main.m Anda Argumen terakhir harus ditetapkan ke nama kelas yang mengimplementasikan protokol UIApplicationDelegate.

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
sho
sumber
49
Pilihan lain adalah memastikan kelas delegasi aplikasi diimpor di main dan digunakan NSStringFromClass. Begitulah Xcode sekarang membuat file main.m. Sebagai contoh: #import "AppDelegate.hdan kemudianint retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
sho
10
Pastikan self.windowdiinisialisasi sepertiself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor
1
Saya mencoba opsi di atas, tidak berhasil untuk saya. Dan saya tidak menggunakan Storyboard.
jowie
3
Tidak berpengaruh pada saya, pesan "Aplikasi diharapkan ..." yang sama setelah melakukan perubahan. Solusinya adalah jawaban OrdoDei (lihat di atas atau di bawah) yang bekerja dengan sempurna.
Andrew
1
Jika Anda melihat tampilan putih di Simulator tetapi diharapkan untuk melihat tata letak dari storyboard pastikan Anda menyingkirkan kode di fungsi root delegate Anda "aplikasi didFinishLaunchingWithOptions ..." yang diarahkan ke main.m dan hanya memiliki "kembali IYA;" di dalamnya.
Olivier de Jonge
435

Ganti di AppDelegate

 [window addSubview:[someController view]];

untuk

  [self.window setRootViewController:someController];
OrdoDei
sumber
Ini menghilangkan pesan untukku. Itu masih tidak menampilkan jendela berikutnya tetapi itu mungkin masalah yang berbeda. Terima kasih.
Jazzmine
3
Jika Anda menggunakan UINavigationController, Anda harus terlebih dahulu [[UINavigationController] initWithRootViewController: tableViewController] dan kemudian menggunakan kode di atas [self.window setRootViewController: self.navigationController] untuk mengatur pengontrol tampilan root jendela
emdog4
Cocos2d memiliki komentar yang mengatakan "// AddSubView tidak berfungsi di iOS6" Jadi ini memperbaikinya bagi saya, karena saya menggunakan iOS 6.
Almo
1
The addSubviewgaris adalah bagian dari template proyek pada versi awal dari Xcode / iOS SDK. Jika aplikasi berjalan jauh, Anda mungkin memilikinya bahkan jika Anda tidak menulisnya.
Seva Alekseyev
halo saya mendapatkan kesalahan ini: - *** Pernyataan kegagalan dalam - [UIApplication _runWithMainScene: transitionContext: completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 cara mengatasi ini
Akash Raghani
70

Saya memiliki kesalahan yang sama ketika mencoba untuk mengubah pengontrol tampilan pertama yang dimuat

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

Pada awalnya saya tidak benar-benar tahu dari mana kesalahan itu berasal, jadi saya mempersempitnya dan mencari tahu apa yang salah. Ternyata saya mencoba mengubah tampilan tampilan sebelum benar-benar muncul di layar. Solusinya adalah dengan memindahkan kode ini di viewcontroller yang membuat saya kesulitan

- (void)viewDidLoad

untuk

- (void)viewDidAppear:(BOOL)animated

dan kesalahan berhenti muncul. Masalah saya secara khusus disebabkan oleh membuat UIAlertViewpertunjukan.

Dalam kasus Anda, saya sarankan Anda memeriksa kode di pengontrol tampilan aktif tabBarController (karena mungkin masalah dalam pengontrol tampilan itu). Jika itu tidak berhasil, cobalah untuk mengatur pengaturan awal di file nib alih-alih dalam kode - atau jika Anda ingin melakukannya dalam kode, coba pindahkan kode ke metode yang sesuai viewController tabBarController aktif.

Semoga berhasil!

Warkst
sumber
1
Warkst, terima kasih atas jawabannya. Dalam kasus saya, saya tidak dapat memindahkan kode viewDidLoad:(tanpa menambahkan bendera), saya juga tidak harus melakukan ini. Bagaimanapun, terima kasih atas sarannya!
ArtSabintsev
2
Menemukan ini hari ini dan senang saya lakukan - masalah yang sama - menunjukkan uialert peluncuran di viewDidLoad. Diubah menjadi viewDidAppear dan berfungsi dengan baik. Tidak yakin apa yang bisa dicapai Apple dengan mengubah ini di iOS5.
GuybrushThreepwood
Terima kasih atas saran bahwa tampilan peringatan menyebabkannya, masalah yang sama terjadi pada saya juga.
Chris
1
Bisakah Anda memberi tahu kami kode apa yang harus Anda hapus untuk mengatasinya? Saya menggunakan saya viewDidLoaduntuk banyak hal, mengatur semua hal pertama kali, seperti menambahkan data ke UITableView. Saya tidak dapat memindahkannya ke viewDidAppear:karena saya hanya ingin api sekali.
jowie
1
Masalahnya bukan fungsi yang salah. Masalahnya adalah Anda lupa memanggil [super viewDidLoad] di fungsi viewDidLoad Anda, secara efektif membunuh beban nib. Hal yang sama terjadi pada saya lebih dari satu kali.
borrrden
47

Saya mendapatkan ini ketika mulai dengan template "Aplikasi Kosong" dan kemudian secara manual menambahkan XIB. Saya memecahkannya dengan menetapkan nama Nib utama seperti yang disarankan oleh Sunny. Langkah yang hilang dalam skenario ini sedang dihapus

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

dari

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

Karena itu akan menimpa instance jendela Anda yang dibuat dalam file Xib. Ini dengan asumsi Anda telah membuat ViewController dan menghubungkannya dengan jendela Anda dan App Delegate di file XIB juga.

jlujan
sumber
Ini memperbaikinya untuk saya juga. Saya menggunakan aplikasi Tab dengan Storyboard yang saya coba tambahkan CoreData, dan mengalami masalah ini.
gitaarik
lol jika saya menambahkan ini saya mendapatkan dua peringatan bahwa Aplikasi windows diharapkan memiliki pengontrol tampilan root !!
George Asda
46

Ini terjadi pada saya. Dipecahkan dengan mengedit file .plist. Tentukan nama dasar file nib utama (seharusnya MainWindow.xib). Semoga ini bisa membantu.

masukkan deskripsi gambar di sini

Sunny
sumber
2
Ini berhasil untuk saya! Ini berfungsi ketika Anda membuat proyek kosong di Xcode 4.2, di mana tidak ada MainWindow akan hadir dan ini bagaimana kita harus menghubungkannya.
ampun
Masalahnya bagi kami terjadi ketika kami secara tidak sengaja menghapus baris 'Nama basis file file utama' dari file 'Info.plist'. Memasukkan baris ini lagi memperbaiki masalah.
rtovars
Anda juga dapat mengatur ini di properti proyek. Pilih proyek, target Anda, Anda dapat mengedit ini di Ringkasan -> Info Penerapan iPhone / iPad.
doekman
ini sebenarnya masalah bagi saya, yang mengarah ke beberapa masalah yang berhubungan dengan memanggil viewDidLoad dan viewWillAppear dua kali pada rootViewController. Dalam kasus saya menghapus ini adalah solusinya
whyoz
27

Saya mengalami masalah yang sama baru-baru ini, ketika membangun proyek dengan ios5 SDK. Pada awalnya itu membangun dan berjalan dengan baik, tetapi setelah itu kesalahan muncul.
Dalam kasus saya solusinya agak sederhana.
Apa yang hilang, adalah bahwa entah bagaimana properti Antarmuka Utama di tab ringkasan target aplikasi saya terhapus. Jadi saya perlu mengaturnya lagi.


Jika ini bukan intinya, dan jika tabBarController masih nol, Anda selalu dapat membuat pemrograman dan pengendali root. Sebagai cadangan saya menambahkan kode berikut ke proyek saya

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

Ini hanya akan berfungsi jika solusi Sho diterapkan juga.

denicija
sumber
24

Saya memutakhirkan ke iOS9 dan mulai mendapatkan kesalahan ini entah dari mana. Saya dapat memperbaikinya tetapi menambahkan kode di bawah ini ke- (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;
    }
}
Mike Flynn
sumber
Saya ingin tahu berapa banyak jendela yang dimiliki aplikasi Anda dan apakah semuanya memiliki pengontrol tampilan root. Terima kasih
DrAL3X
5
CATATAN : Jawaban ini merupakan solusi dan tidak memperbaiki akar permasalahan. Lihat stackoverflow.com/a/33958144/1116061
lipka
Anda adalah pahlawan sejati!
user2161301
21

Tidak ada saran di atas yang menyelesaikan masalah saya. Milik saya adalah ini:

Menambahkan:

window.rootViewController = navigationController;

setelah:

[window addSubview:navigationController.view];

di delegasi app saya

- (void)applicationDidFinishLaunching:(UIApplication *)application {
RyeMAC3
sumber
20
  • Pilih "Jendela" Anda di File Nib Anda
  • Dalam "Atribut Inspektur" Periksa "Visible at Launch"

gambar![]

  • Ini terjadi ketika file nib Anda dibuat secara manual.
  • Perbaikan ini berfungsi untuk mode nib biasa - bukan mode papan cerita
bearMountain
sumber
Ini hanya ditemukan di Storyboard Mode, saya kira.
ArtSabintsev
Tidak, proyek ini adalah mode nib biasa. Ini adalah tangkapan layar dari Storyboard Mode. "Visible at Launch" vs. "Is Initial View Controller".
bearMountain
3
Jika file nib jendela dibuat secara manual, dan "terlihat saat peluncuran" tidak dicentang secara default akan menanyakan pesan ini setelah peluncuran aplikasi, ini memperbaiki masalah saya!
ZYiOS
OH TERIMA KASIH!!! Akhirnya, solusi untuk peringatan yang menjengkelkan ini. Bahkan jika Anda memilikinya makeKeyAndVisibletidak menyelesaikan masalah. HANYA ini menyelesaikan peringatan untuk saya. TERIMA KASIH!
tacos_tacos_tacos
'Ini terjadi dalam mode nib biasa - bukan mode storyboard` Tidak terlalu benar. Saya menghadapi masalah yang sama dengan Storyboardjuga
musim panas
19

cara menambahkan RootViewController untuk iOS5

jika aplikasi Anda tidak menggunakan RootViewController sampai sekarang, cukup buat satu;) dengan menekan File> New> New File; pilih UIViewController subclass nama itu RootViewController , hapus centang dengan XIB untuk antarmuka pengguna (dengan asumsi Anda sudah memilikinya) dan masukkan kode ini di AppDelegate :: didFinishLaunchingWithOptions Anda

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

pasti - Anda harus mengimpor RootViewController.h dan membuat variabel

di sini ada artikel yang bagus tentang RootViewController dan AppDelegate,

rev rémy
sumber
Tautan artikel cupsofcocoa.com sudah mati - ada ide jika ada salinan di suatu tempat?
Ríomhaire
1
ini telah pindah ke binpress.com, memperbarui tautan dalam jawabannya
rémy
Itu tautan yang bagus. Baik membaca dan menjelaskan apa yang terjadi. Saya baru saja mengalami masalah ini juga menggunakan buku lama (karena saya ingin belajar Objective-C dulu) tetapi menulis kode pada XCode 7 terbaru, yang tidak memiliki templat yang lebih lama.
ibaralf
11

Saya juga mengalami kesalahan ini tetapi tidak seperti jawaban yang saya sebutkan sebelumnya adalah karena saya telah menghapus komentar metode 'loadView' pada pengontrol yang baru saya buat (xcode 4.2, ios5).

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

Bahkan mengatakan kepada saya bahwa metode ini adalah untuk membuat tampilan secara terprogram tetapi saya melewatkannya karena terlihat sangat mirip dengan metode lain seperti viewDidLoad yang biasanya saya gunakan saya tidak menangkapnya.

Untuk menyelesaikannya cukup hapus metode itu jika Anda tidak secara terprogram membuat hierarki tampilan alias menggunakan nib atau storyboard.

trcarden
sumber
Saya dapat mengkonfirmasi bahwa ini dapat menyebabkan masalah. Saya mengalami situasi yang sama dengan mengikuti tutorial tentang TableView di mana mereka membuat mengatur delegasi di loadView. Setelah memindahkan kode itu ke viewDidLoad dan menghapus loadView, semuanya mulai berfungsi sesuai kebutuhan.
Eugen
Anda masih dapat menggunakan tampilan pemuatan tetapi menambahkan [super loadView]; pada awalnya.
Hermann Klecker
1
Hmm ... dokumentasi untuk loadView secara khusus menyatakan bahwa Anda tidak boleh memanggil metode super.
Joshua Sullivan
Saya mengesampingkan UIViewController default di storyboard dan menemukan bahwa kode templat untuk membuat subkelas UIViewController telah mengaktifkan loadView secara default yang menyebabkan ini bagi saya ... terbuang lebih dari satu jam untuk hal konyol ini. Terima kasih telah memposting ini!
slycrel
11

Saya punya masalah ini juga. saya menjalankan proyek saya di xcode4.2.1. Saya sudah membaca semua komentar di sana, tetapi tidak ada yang keren untuk saya. setelah beberapa saat, saya menemukan bahwa saya berkomentar sepotong kode.

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

maka saya batalkan komentar itu. semuanya baik-baik saja untukku. Semoga ini bisa membantu kalian.

Bruce Lee
sumber
Kode: "self.window = [[alokasi UIWindow] initWithFrame: [[UIScreen mainScreen] bounds]];" menyebabkan kesalahan, jadi saya baru saja menghapusnya.
Grigori A.
11

Pastikan Anda memiliki fungsi ini dalam delegasi aplikasi Anda.

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

Pastikan didFinishLaunchingWithOptions mengembalikan YA. Jika Anda tidak sengaja menghapus baris 'return YES', ini akan menyebabkan kesalahan. Kesalahan ini mungkin sangat umum terjadi pada pengguna storyboard.

anti-siklus
sumber
banyak pujian, inilah yang saya inginkan (proyek kosong dengan storyboard)
Shtirlic
2
Sama disini. Terima kasih. Jika Anda membuat aplikasi kosong, metode ini diisi dengan pembuatan jendela secara manual. Ini harus diubah untuk hanya mengembalikan YA. Thx
Ben G
10

Dengan tampilan pertama saya, MenuViewControllersaya menambahkan:

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

pada metode App Delegate:

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

Itu berhasil.

cujino
sumber
10

Ada sedikit perubahan di sekitar iOS 5.0 atau lebih, yang mengharuskan Anda memiliki pengontrol tampilan root. Jika kode Anda didasarkan pada kode sampel yang lebih lama, seperti GLES2Sample , maka tidak ada pengendali tampilan root yang dibuat dalam sampel kode tersebut.

Untuk memperbaikinya (GLES2Sample itu, misalnya), tepat di applicationDidFinishLaunching, saya membuat pengontrol tampilan root dan melampirkan glView saya untuk itu.

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

Itu membuat peringatan hilang, dan sebaliknya tidak mempengaruhi aplikasi Anda.

bobobobo
sumber
9

Cobalah untuk menyambungkan IBOutlet dari pengontrol tab bar untuk membasmi tampilan di Interface Builder alih-alih

self.window.rootViewController = self.tabBarController;

Tapi sebenarnya saya belum pernah melihat kesalahan seperti itu sebelumnya.

d.lebedev
sumber
8

Saya memecahkan masalah dengan melakukan hal berikut (tidak ada solusi lain di atas yang membantu):

Dari menu tarik turun yang terkait dengan "Antarmuka Utama" pilih entri lain dan kemudian pilih kembali "MainWindow" lalu bangun kembali.

masukkan deskripsi gambar di sini

RawMean
sumber
8

Saya menemukan masalah yang sama tetapi saya menggunakan storyboard

Menugaskan saya storyboard InitialViewControllerke jendela saya rootViewController.

Di

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

dan ini memecahkan masalah.

musim panas ini
sumber
7

Saya mulai mengalami masalah yang sama tepat setelah memutakhirkan ke Xcode 4.3, dan hanya ketika memulai proyek dari awal (yaitu membuat proyek kosong, kemudian membuat UIViewController, dan kemudian Buat file nib terpisah).

Setelah meletakkan SEMUA baris yang saya gunakan, dan memastikan saya memiliki koneksi yang benar, saya terus mendapatkan kesalahan itu, dan file nib yang saya coba muat melalui view controller (yang ditetapkan sebagai rootController) tidak pernah ditampilkan di simulator.

Saya membuat template tampilan tunggal melalui Xcode dan membandingkannya dengan kode saya dan AKHIRNYA menemukan masalahnya!

Xcode 4.3 muncul untuk menambahkan secara default metode - (void) loadView; ke bagian implementasi pengontrol tampilan. Setelah dengan hati-hati membaca komentar di dalamnya, menjadi jelas apa masalahnya. Komentar yang ditunjukkan untuk mengganti metode loadView jika membuat tampilan secara terprogram (dan saya parafrase), sebaliknya TIDAK untuk mengganti loadView jika menggunakan nib. Tidak ada hal lain di dalam metode ini, jadi dalam pengaruh saya menimpa metode (dan tidak melakukan apa-apa) SAAT menggunakan file nib, yang memberikan kesalahan.

SOLUSI adalah untuk sepenuhnya menghapus metode loadView dari bagian implementasi, atau untuk memanggil metode induk dengan menambahkan [super loadView].

Menghapusnya akan lebih baik jika menggunakan file NIB sebagai menambahkan kode lain akan berlaku menimpanya.

Raz
sumber
itulah masalah saya! Saya telah menambahkan implementasi loadView tetapi tidak memanggil super. Apakah beberapa perubahan kode lain, tidak ingat apa yang saya lakukan. Membuat saya macet selama 2 jam karena perubahan itu tampak tidak berbahaya.
LearnCocos2D
6

Saya memiliki pesan kesalahan yang sama di log. Saya memiliki aplikasi UIAlertView yang muncul: didFinishLaunchingWithOptions. Saya menyelesaikannya dengan menunda panggilan ke alertView untuk memberikan waktu bagi pengontrol tampilan root untuk menyelesaikan pemuatan.

Dalam aplikasi: didFinishLaunchingWithOptions:

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

yang memanggil setelah 1 detik:

- (void)callPopUp
{
    // call UIAlertView
}
janeway
sumber
Terima kasih, ini menyelesaikan masalah saya. Anda harus menunggu untuk menunjukkan peringatan sampai setelah jendela dimuat. Dalam kasus saya, saya baru saja melakukan [alert performSelector: @selector (show) withObject: nil afterDelay: 1.0];
deepwinter
6

Saya memiliki masalah yang sama. Jika Anda membuat aplikasi berbasis jendela "dari awal" seperti saya, Anda harus melakukan yang berikut: (perhatikan, ini adalah langkah-langkah untuk Xcode 4.2.)

0. Pastikan delegasi aplikasi Anda sesuai dengan protokol UIApplicationDelegate.

Sebagai contoh, misalkan delegasi kami disebut MyAppDelegate. Di MyAppDelegate.h, kita harus memiliki sesuatu seperti ini:

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

1. Tentukan delegasi aplikasi di main.m

Sebagai contoh,

#import "MyAppDelegate.h"

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

2. Buat file antarmuka jendela utama.

Untuk melakukan ini, klik kanan pada proyek Anda dan pilih File Baru. Dari sana, pilih Window dari iOS -> bagian User Interface.

Setelah menambahkan file ke proyek Anda, pergi ke ringkasan proyek (klik kiri pada proyek; klik ringkasan.) Di bawah iPhone / iPod Deployment Info (dan bagian iPad yang sesuai jika Anda mau) dan pilih file antarmuka baru Anda di " Kotak kombo "" Antarmuka Utama.

3. Hubungkan semuanya di editor antarmuka

Pilih file antarmuka Anda dalam daftar file untuk memunculkan editor antarmuka.

Pastikan panel Utilities terbuka.

Tambahkan Objek baru dengan menyeret Objek dari daftar Objek di panel Utilitas ke ruang di atas di bawah objek Window Anda. Pilih objek. Klik pada inspektur Identitas di panel Utilities. Ubah Kelas menjadi delegasi aplikasi (MyAppDelegate, dalam contoh ini.)

Buka inspektur koneksi untuk MyAppDelegate. Hubungkan outlet jendela ke Window yang sudah ada di file antarmuka.

Klik pada Pemilik File di sebelah kiri, dan kemudian klik pada inspektur Identitas di panel Utilities. Ubah Kelas menjadiUIApplication

Angkat inspektur koneksi untuk Pemilik File. Hubungkan outlet delegasi ke objek MyAppDelegate.

4. Terakhir, dan yang sangat penting, klik pada objek Window di file antarmuka. Buka inspektur Atribut. Pastikan "Visible at Launch" dicentang.

Hanya itu yang harus saya lakukan untuk membuatnya bekerja untuk saya. Semoga berhasil!

Tom
sumber
6

Jika Anda menggunakan MTStatusBarOverlay, maka Anda akan mendapatkan kesalahan ini.

MTStatusBarOverlay membuat jendela tambahan ([[UIApplication sharedApplication] windows) yang tidak memiliki pengendali root.

Ini sepertinya tidak menimbulkan masalah.

Vorlon yang bingung
sumber
Apa kamu yakin akan hal itu? Sudahkah Anda mengujinya?
Sergey Grischyov
Saya yakin itu menciptakan jendela & saya yakin itu tidak membuat masalah di aplikasi saya.
Vorlon yang Bingung
Anda bisa mengatur Dummy VC ke MTStatusBarOverlay untuk memperbaikinya.
Wesley
Ini persis masalah saya. Saya memiliki pengaturan yang serupa dengan jendela yang ditambahkan untuk bilah notifikasi, dan begitu saya berkomentar bahwa kesalahannya hilang! Tampaknya tidak berbahaya dalam kasus ini.
Aaron Zinman
6

Menerima kesalahan yang sama setelah mengganti UI saya dengan Storyboard, menggunakan XCode 4.6.3 dan iOS 6.1

Memecahkannya dengan menghapus semua kode dari didFinishLaucnhingWithOptions di AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
Pétur Ingi Egilsson
sumber
5

OrdoDei memberikan jawaban yang benar dan berharga. Saya menambahkan jawaban ini hanya untuk memberikan contoh didFinishLaunchingWithOptionsmetode yang menggunakan jawabannya serta memperhitungkan komentar orang lain mengenai Navigasi Kontroler.

- (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;
}
Basil Bourque
sumber
4

Ini terjadi pada saya karena saya secara tidak sengaja berkomentar:

[self.window makeKeyAndVisible];

dari

- (BOOL)application:(UIApplication*) didFinishLaunchingWithOptions:(NSDictionary*)
nicerobot
sumber
4

Saya dapat mengatur pengontrol tampilan awal pada layar ringkasan xcode.

Klik pada nama proyek paling atas di explorer file sebelah kiri (seharusnya memiliki ikon cetak biru kecil). Di kolom tengah klik pada nama proyek Anda di bawah 'TARGETS', (itu harus memiliki ikon 'A' pensil kecil di sebelahnya). Cari di bawah 'Info Penerapan iPhone / iPod' dan cari 'Antarmuka Utama'. Anda harus dapat memilih opsi dari drop down.

RachelD
sumber
4

Di atas jawaban "sho", itu benar (parameter keempat UIApplicationMain harus nama pengendali utama), saya menambahkan beberapa komentar.

Saya baru-baru ini mengubah 'model' aplikasi saya dari menggunakan MainWindow.xib untuk membangun jendela secara programatik. Aplikasi ini menggunakan templat yang lebih lama yang membuat MainWindow secara otomatis. Karena saya ingin mendukung tampilan pengontrol XIB yang berbeda untuk iPhone 5, lebih mudah untuk memilih XIB yang tepat secara programatis ketika Delegasi Aplikasi dibuat. Saya menghapus MainWindow.xib dari proyek juga.

Masalahnya adalah, saya lupa untuk mengisi parameter keempat di utama aplikasi UIA dan saya LUPA MEMINDAHKAN MainWindow dari "Antarmuka Utama" di Ringkasan Proyek.

Ini menyebabkan masalah besar: itu membuat peringatan yang tidak berbahaya "Aplikasi diharapkan untuk ..." pada perangkat pengembangan, tetapi ketika pergi ke App Store, itu pecah pada ponsel konsumen, mogok karena MainWindow tidak lagi ada dalam bundel! Saya harus meminta ulasan yang dipercepat untuk perbaikan bug.

Gejala lain adalah bahwa kadang-kadang blok putih, seperti UIView kosong, kadang-kadang muncul ketika Pengaturan diubah dan aplikasi diletakkan di latar depan. Di iPhone 5 jelas bahwa itu adalah blok 320x480. Mungkin MainWindow yang hilang sedang dibuat dalam mode pengembangan, menggunakan ukuran lama. Saya baru saja menemukan bug ini ketika laporan pertama crash mencapai kotak masuk.

Menginstal aplikasi dari App Store bukannya dari XCode menunjukkan bahwa aplikasi tersebut benar-benar macet, dan masalah MainWindow muncul dengan sendirinya di log, jadi saya bisa melihat bahwa itu bukan kombinasi khusus perangkat + versi iOS.

epx
sumber
4

Untuk menambah jawaban Mike Flynn, sejak meningkatkan ke Xcode 7 dan menjalankan aplikasi saya di perangkat iOS 9, saya menambahkan ini ke (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;
    }
}
Kevin_TA
sumber
Saya ingin tahu berapa banyak jendela yang dimiliki aplikasi Anda dan apakah semuanya memiliki pengontrol tampilan root. Terima kasih
DrAL3X
3

Masalah ini terjadi ketika Anda tidak memasang Interface Builder dengan benar.

Pastikan jendela App Delegate Anda dan outlet viewController terhubung:

Di MainWindow.xib Anda, tahan kontrol, klik App Delegate dan seret ke objek Window. Pilih jendela. Tahan kontrol dan pilih delegasi App lagi, seret ke controller tampilan root Anda dan pilih viewController.

uranazo
sumber
3

Kesalahan ini juga muncul ketika pemilik file MainWindow.xib diatur secara tidak benar.

Pemilik file adalah
aplikasi UIA -> objek yang dimasukkan dari kelas delegasi aplikasi dengan outlet jendela yang terhubung ke jendela

JakubKnejzlik
sumber
Saya membuat file xib secara manual dan mulai mendapatkan kesalahan ini. terima kasih banyak!
RawMean