Очікується, що в кінці запуску програми контролер перегляду кореневих програм буде мати


383

У моїй консолі з'являється така помилка:

Очікується, що в кінці запуску програми контролер перегляду кореневих програм буде мати

Нижче наведено мій application:didFinishLaunchWithOptionsметод:

- (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 UITabBarControllerделегат підключений до Делегата додатків.

Хтось знає, як виправити це питання?


5
Зробіть NSLog self.tabBarController безпосередньо перед тим, як виконати завдання. Повідомлення спрацьовує лише тоді, коли контролер нульовий. Якщо він дорівнює нулю, і ви переконалися, що з'єднання правильні, спробуйте інстанціювати контролер у коді.
FeifanZ

намагатися коментувати ініціалізацію вікна .. перевірити цю відповідь stackoverflow.com/a/33958144/1293445
Mohammad alabid

Відповіді:


188

У мене була ця сама проблема. Перевірте свій головний метр. Останній аргумент повинен бути встановлений назвою класу, який реалізує протокол UIApplicationDelegate.

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

49
Інший варіант - переконатися, що клас делегата додатків імпортується в основному та у використанні NSStringFromClass. Ось так Xcode створює файл main.m. Наприклад: #import "AppDelegate.hа потімint retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
шо

10
переконайтеся, що self.windowініціалізовано якself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor

1
Я спробував перераховані вище варіанти, не вдалося мені. І я не використовую Розкадровку.
jowie

3
Не вплинуло на мене, те саме повідомлення "Очікуються програми ..." після внесення змін. Рішення було відповіддю OrdoDei (див. Вище чи нижче), яке спрацювало чудово.
Андрій

1
Якщо ви бачите білий симулятор у симуляторі, але очікується, що він побачить макет із дошки розкадрів, переконайтеся, що ви позбулися від коду у вашій функції кореневого делегата "додаток didFinishLaunchingWithOptions ...", на який вказується main.m і має лише "return ТАК;" у цьому.
Олів'є де Йонге,

435

Замініть в AppDelegate

 [window addSubview:[someController view]];

до

  [self.window setRootViewController:someController];

Це позбулося повідомлення для мене. Це ще не відображає наступне вікно, але це може бути інша проблема. Дякую.
Джазмін

3
Якщо ви використовуєте UINavigationController, спочатку слід [[UINavigationController] initWithRootViewController: tableViewController], а потім скористатися кодом вище [self.window setRootViewController: self.navigationController], щоб встановити кореневий контролер вікна
emdog4 16

У Cocos2d є коментар, який говорить "// AddSubView не працює на iOS6", тому це виправлено для мене, оскільки я використовую iOS 6.
Almo

1
addSubviewЛінія була частиною шаблону проекту на ранній версії Xcode / IOS SDK. Якщо додаток триває довгий шлях, ви можете мати його, навіть якщо ви його не написали.
Сева Алексєєва

привіт, я отримую цей ерор: - *** Невдача ствердження в - [UIApplication _runWithMainScene: переходContext: завершення:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 як вирішити це
Акаш Рагані

70

У мене була така ж помилка при спробі змінити перший завантажений контролер

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

Спочатку я не дуже знав, звідки саме ця помилка, тому я звузив її і дізнався, що пішло не так. Виявляється, я намагався змінити показ зображення, перш ніж він насправді з’явився на екрані. Таким чином, рішення було перемістити цей код у контролері перегляду, що доставляло мені проблеми

- (void)viewDidLoad

до

- (void)viewDidAppear:(BOOL)animated

і помилка перестала з’являтися. Моя проблема конкретно була викликана тим, що я робив UIAlertViewшоу.

У вашому випадку я пропоную вам перевірити код у контролері активного перегляду tabBarController (оскільки це, мабуть, проблема в цьому контролері перегляду). Якщо це не працює, спробуйте встановити початкові налаштування у файлі nib, а не в коді - або, якщо ви хочете зробити це в коді, спробуйте перемістити код до відповідного методу активного перегляду контролера тактикиBarController.

Удачі!


1
Варкст, дякую за відповідь. У моєму випадку я не можу перемістити код viewDidLoad:(не додаючи прапор), і мені це робити не повинно. Незалежно, дякую за пропозицію!
ArtSabintsev

2
Виявив це сьогодні і радий, що в цьому ж питанні я показав запуск uialert у viewDidLoad. Змінено на viewDidAppear і працює чудово. Не впевнений, чого більшого блага досягає Apple, змінивши це в iOS5.
GuybrushThreepwood

Дякую за припущення, що його викликав огляд попередження, та сама проблема трапилася і зі мною.
Кріс-

1
Не могли б ви сказати нам, який код потрібно було видалити, щоб розібратися? Я використовую свою viewDidLoadфункцію для багатьох речей, налаштовуючи всі речі вперше, наприклад додавання даних до UITableView. Я не можу перенести це, viewDidAppear:бо хочу лише, щоб він вистрілив один раз.
jowie

1
Проблема полягала не в неправильній функції. Проблема полягала в тому, що ви забули викликати [super viewDidLoad] у своїй функції viewDidLoad, що ефективно знищує навантаження ручки. Те саме траплялося зі мною не раз.
borrrden

47

Це я отримав, починаючи з шаблону "Порожня програма", а потім додаючи XIB вручну. Я вирішив це, встановивши основне ім'я Nib, як запропонував Соні. Відсутній крок у цьому сценарії - це усунення

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

з

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

Оскільки він замінить екземпляр вашого вікна, створеного у файлі Xib. Це припущення, що ви створили ViewController і з'єднали його зі своїм вікном та делегатом додатків у файлі XIB.


Це зафіксувало і для мене. Я використовував додаток Tabbed із дошкою розповідей, до якої я намагався додати CoreData, і наткнувся на цю проблему.
gitaarik

хаха, якщо я додам це, я отримую два попередження про те, що вікна програми мають мати контролер кореневого виду !!
Джордж Асда

46

Це сталося зі мною. Вирішено шляхом редагування .plist-файлу. Вкажіть базове ім'я файлу Main nb. (Має бути MainWindow.xib). Сподіваюсь, це допоможе.

введіть тут опис зображення


2
Це працювало для мене! Це спрацьовує, коли ви створюєте порожній проект у Xcode 4.2, де немає головного вікна, і ми маємо його підключити.
jeevangs

Проблема для нас виникла, коли ми ненавмисно видалили рядок "Основне ім'я базового файлу" з файлу "Info.plist". Повторне вставлення цього рядка вирішило проблему.
rtovars

Ви також можете встановити це у властивостях проекту. Виберіть проект, свою ціль, ви можете відредагувати його в Звіті -> Інформація про розгортання iPhone / iPad.
doekman

це насправді була проблемою для мене, що призвело до декількох проблем, що стосуються виклику viewDidLoad та viewWillAppear двічі на rootViewController. У моєму випадку це було рішення
чому

27

Я зіткнувся з тією ж проблемою нещодавно, коли будував проект з ios5 sdk. Спочатку він будувався і працює належним чином, але після цього з’явилася помилка.
У моєму випадку рішення було досить простим.
Чого не вистачало, було те, що якось властивість Основний інтерфейс на вкладці "Підсумок" моєї програми застосована. Тому мені потрібно було її встановити ще раз.


Якщо справа не в цьому, і якщо tabBarController все ще є нульовим, ви завжди можете програмно створити вікно та кореневий контролер. Як резервний додаток я додав наступний код до свого проекту

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

Це буде працювати лише в тому випадку, якщо також буде реалізовано рішення шо.


24

Я перейшов на iOS9 і почав отримувати цю помилку з нізвідки. Я зміг це виправити, але додав нижче наведений код- (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;
    }
}

Мені цікаво дізнатись, скільки вікон у вашому додатку і чи всі вони мали контролер перегляду коренів. Дякую
DrAL3X

5
ПРИМІТКА . Ця відповідь є вирішувальною і не виправляє першопричину. Дивіться stackoverflow.com/a/33958144/1116061
lipka

Ви справжній герой!
користувач2161301

21

Жодна з наведених пропозицій не вирішила мою проблему. Моє було таке:

Додати:

window.rootViewController = navigationController;

після:

[window addSubview:navigationController.view];

в моїх додатках

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

20
  • Виберіть "Вікно" у файлі Nib
  • У пункті "Інспектор атрибутів" встановіть прапорець "Видимий при запуску"

зображення! []

  • Це відбувається, коли ваш файл nib створюється вручну.
  • Це виправлення працює в звичайному режимі ручки - не в режимі розкадровки

Я думаю, що це лише в режимі розкадровки.
ArtSabintsev

Немає уваги, що цей проект був звичайним режимом ручки. Це скріншот із режиму розгортки. "Видно при запуску" та "Контролер початкового перегляду".
ведмідьмора

3
Якщо файл вікна, створений вручну, і "видимий при запуску" не встановлено прапорці за замовчуванням, підкаже це повідомлення після запуску програми, це вирішить мою проблему!
ZYiOS

О, ДЯКУЮ ТОБІ!!! Нарешті, рішення цього дратівливого попередження. Навіть якщо у вас makeKeyAndVisibleце є, це не вирішує проблему. ТІЛЬКИ це вирішило попередження для мене. ДЯКУЮ ТОБІ!
tacos_tacos_tacos

"Це відбувається в звичайному режимі ручки - не в режимі розкадровки". Не дуже правда. Я зіткнувся з такою ж питання з Storyboardтакож
thesummersign

19

як додати RootViewController для iOS5

якщо ваш додаток до цього часу не використовував RootViewController, просто створіть його;) натиснувши Файл> Новий> Новий файл; виберіть UIViewController subclass ім'я це RootViewController , зніміть прапорець З XIB для користувальницького інтерфейсу (якщо припустимо, що у вас вже є) та введіть цей код у свій AppDelegate :: didFinishLaunchingWithOptions

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

точно - вам потрібно імпортувати RootViewController.h і створити змінну

ось приємна стаття про RootViewController та AppDelegate,


Посилання статті cupsofcocoa.com мертве - будь-яка ідея, якщо десь є копія?
Ríomhaire

1
це перемістилося на binpress.com, оновило посилання у відповіді
1616

Це чудове посилання. Добре прочитайте та поясніть, що відбувається. Я щойно зіткнувся з цим питанням, а також використовував стару книгу (оскільки спочатку хочу вивчити Objective-C), але пишу код на останньому XCode 7, у якому немає старих шаблонів.
ibaralf

11

У мене також була ця помилка, але на відміну від будь-яких відповідей, раніше перерахованих, було те, що я коментував метод 'loadView' у моєму новоспеченому контролері (xcode 4.2, ios5).

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

Він навіть сказав мені, що метод призначений для створення подання програмно, але я пропустив його, тому що він виглядав настільки схожим на інші методи, як viewDidLoad, що я, як правило, використовую, я його не спіймав.

Щоб вирішити, просто видаліть цей метод, якщо ви програмно не створюєте ієрархію перегляду, а також за допомогою кнопок або дошки.


Я можу підтвердити, що це може спричинити проблему. У мене була така ж ситуація, дотримуючись підручника про TableView, де вони створюють, встановлюють делегатів у loadView. Після переміщення цього коду до viewDidLoad та видалення loadView все почало працювати, як потрібно.
Євген

Ви все ще можете використовувати перегляд завантаження, але додати [super loadView]; на його початку.
Герман Клекер

1
Хм ... в документації для loadView конкретно зазначено, що не слід викликати супер метод.
Джошуа Салліван

Я перемінив UIViewController за замовчуванням на дошці розкопок і виявив, що код шаблону для створення підкласу UIViewController має loadView, включений за замовчуванням, викликаючи це для мене ... витрачав більше години на цю нерозумну річ. Дякуємо, що опублікували це!
slycrel

11

У мене теж були ці проблеми. У мене проект запустився в xcode4.2.1. я читав усі коментарі там, але мені ніхто не здоровий. через деякий час я виявив, що я прокоментував фрагмент коду.

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

тоді я прокоментував це. для мене все гаразд. сподіваюся, що це допоможе вам, хлопці.


Код: "self.window = [[UIWindow alloc] initWithFrame: [межі [основного екрана UIScreen]]];" викликати помилку, тому я просто її видалив.
Григорій А.

11

Переконайтеся, що ви маєте цю функцію у делегата програми.

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

Переконайтесь, що didFinishLaunchingWithOptions повертає ТАК. Якщо ви видалили рядок "повернути ТАК", це призведе до помилки. Ця помилка може бути особливо частою у користувачів розкадров.


багато кудо, це те, чого я хотів (порожній проект із
раскадровкою

2
Те ж саме. Дякую. Якщо ви створюєте порожню програму, цей спосіб заповнюється ручним створенням вікна. Це слід змінити, щоб просто повернути ТАК. Thx
Ben G

10

Коли MenuViewControllerя додав перший погляд :

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

про метод делегата додатків:

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

Це спрацювало.


10

Навколо iOS 5.0 або дещо змінилася незначна зміна, що вимагало мати контролер кореневого перегляду. Якщо ваш код базується на старому зразковому коді, такому як GLES2Sample , в цих зразках коду не було створено жодного контролера кореневого виду.

Щоб виправити (наприклад, GLES2Sample), я прямо applicationDidFinishLaunchingстворюю контролер кореневого виду і додаю до нього свій glView.

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

Це змушує попередження пропадати, і в іншому випадку не впливає на ваш додаток.


9

Спробуйте підключити IBOutlet контролера панелі вкладок до перегляду коренів у Builder інтерфейсу замість

self.window.rootViewController = self.tabBarController;

Але насправді я раніше не бачив такої помилки.


8

Я вирішив проблему, зробивши наступне (жодне з інших вищезазначених рішень не допомогло):

У спадному меню, пов’язаному з "Основним інтерфейсом", виберіть інший запис, а потім виберіть "Головне вікно", а потім відновіть.

введіть тут опис зображення


8

Я зіткнувся з тим же питанням, але використовував storyboard

Призначаючи моєму storyboard InitialViewControllerвікно rootViewController.

В

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

і це вирішило питання.


7

Цю проблему у мене почали одразу після оновлення до Xcode 4.3, і лише при запуску проекту з нуля (тобто створити порожній проект, потім створити UIViewController, а потім створити окремий файл нибу).

Після розміщення ВСІХ рядків, до яких я звик, і переконавшись, що я мав правильні з'єднання, я продовжував отримувати цю помилку, і файл nib, який я намагався завантажити через контролер перегляду (який був встановлений як rootController), ніколи не з'являвся в тренажері.

Я створив єдиний шаблон перегляду через Xcode і порівняв його зі своїм кодом, і НАРЕШТУ знайшов проблему!

Здається, Xcode 4.3 додає за замовчуванням метод - (void) loadView; до розділу реалізації контролера перегляду. Уважно прочитавши коментарі всередині нього, стало зрозуміло, в чому проблема. У коментарі вказано на переосмислення методу loadView, якщо програмно створювати подання (і я перефразую), інакше НЕ переосмислювати loadView, якщо користуватися кнопкою. Всередині цього методу не було нічого іншого, тому в афект я переосмислював метод (і нічого не робив), використовуючи файл nib, який дав помилку.

SOLUTION повинен був або повністю видалити метод loadView з розділу реалізації, або викликати батьківський метод, додавши [super loadView].

Видалити його було б найкраще, якщо використання файлу NIB, оскільки додавання будь-якого іншого коду, фактично його замінить.


це була саме моя проблема! Я додав реалізацію loadView, але не викликав супер. Були якісь інші зміни коду, я не міг пригадати, що, чорт, я зробив. Мене затримали на 2 години, тому що ця зміна видалася такою нешкідливою.
LearnCocos2D

6

У мене було те саме повідомлення про помилку в журналі. У мене з'явилося спливаюче меню UIAlertView: didFinishLaunchingWithOptions. Я вирішив це, затримавши виклик на alertView, щоб дозволити час, щоб контролер кореневого перегляду закінчив завантаження.

У додатку: didFinishLaunchingWithOptions:

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

який дзвонить через 1 секунду:

- (void)callPopUp
{
    // call UIAlertView
}

Дякую, це вирішило мою проблему. Потрібно зачекати, щоб показати сповіщення, поки не завантажиться вікно. У моєму випадку я щойно зробив [сповіщення performSelector: @selector (show) withObject: nil afterDelay: 1.0];
deepwinter

6

У мене була така ж проблема. Якщо ви будуєте додаток на основі вікна "з нуля", як я був, вам потрібно зробити наступне: (зверніть увагу, це кроки для Xcode 4.2.)

0. Переконайтесь, що ваш делегат програми відповідає протоколу UIApplicationDelegate.

Наприклад, припустимо, наш делегат називається MyAppDelegate. У MyAppDelegate.h у нас повинно бути щось подібне:

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

1. Вкажіть делегата програми в main.m

Наприклад,

#import "MyAppDelegate.h"

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

2. Створіть файл інтерфейсу головного вікна.

Для цього клацніть правою кнопкою миші проект і виберіть команду Створити файл. Звідти виберіть Вікно у розділі iOS -> Інтерфейс користувача.

Додавши файл до свого проекту, перейдіть до резюме проекту (клацніть лівою кнопкою миші на проекті; натисніть резюме.) В розділі Інформація про розгортання iPhone / iPod (і відповідний розділ iPad, якщо вам подобається) та виберіть новий файл інтерфейсу у вікні " Головний інтерфейс "комбо".

3. Підключіть все це в інтерфейсному редакторі

Виберіть інтерфейсний файл у списку файлів, щоб відкрити редактор інтерфейсу.

Переконайтесь, що панель «Утиліти» відкрита.

Додайте новий Об'єкт, перетягнувши Об'єкт зі списку Об'єкти на панелі Утиліти до простору, розташованого нижче під вашим об'єктом Windows. Виберіть об’єкт. Клацніть на інспектора ідентичності на панелі "Утиліти". Змініть клас на делегата програми (MyAppDelegate, у цьому прикладі.)

Виведіть інспектора з’єднань для MyAppDelegate. Підключіть розетку вікна до Вікна, яке вже існує у файлі інтерфейсу.

Клацніть на власника файлу зліва, а потім натисніть на інспектора ідентичності на панелі утиліти. Змініть клас наUIApplication

Виведіть інспектора з’єднань для власника файлу. Підключіть розетку делегата до об'єкта MyAppDelegate.

4. Нарешті, і що дуже важливо, натисніть на об'єкт Window у файлі інтерфейсу. Відкрийте інспектор атрибутів. Переконайтеся, що прапорець "Видимий при запуску".

Це все, що я повинен був зробити, щоб він працював на мене. Удачі!


6

Якщо ви використовуєте MTStatusBarOverlay, ви отримаєте цю помилку.

MTStatusBarOverlay створює додаткове вікно ([[UIApplication sharedApplication] windows), яке не має кореневого контролера.

Це, мабуть, не викликає проблем.


Ви впевнені в цьому? Ви перевірили?
Сергій Грищйов

Я впевнений, що це створює вікно, і я впевнений, що це не створює проблем у моїх програмах.
Плутати Ворлон

Ви можете встановити фіктивний VC на MTStatusBarOverlay, щоб виправити його.
Веслі

Це була саме моя проблема. У мене було подібне налаштування з вікном, яке було додано до панелі сповіщень, і одного разу я прокоментував, що помилка зникла! Це здається в цьому випадку нешкідливим.
Аарон Зінман

6

Отримала таку ж помилку після заміни мого інтерфейсу користувача на Storyboard, використовуючи XCode 4.6.3 та iOS 6.1

Вирішили це, очистивши весь код від didFinishLaucnhingWithOptions в AppDelegate

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

5

ОрдоДей дав правильну і цінну відповідь. Я додаю цю відповідь лише для того, щоб навести приклад didFinishLaunchingWithOptionsметоду, який використовує його відповідь, а також врахування коментарів інших щодо навігаційного контролера.

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

Це сталося для мене, тому що я ненароком прокоментував:

[self.window makeKeyAndVisible];

з

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

4

Мені вдалося встановити початковий контролер перегляду на підсумковому екрані xcode.

Клацніть на самому верхньому назві проекту в лівому досліднику файлів ліворуч (він повинен мати невеликий значок креслення). У середньому стовпчику натисніть назву вашого проекту в розділі "ЦІЛИ", (біля нього має бути маленький значок "Олівець"). Перегляньте розділ "Інформація про розгортання iPhone / iPod" та знайдіть "Головний інтерфейс". Ви повинні мати можливість вибрати варіант зі спадного меню.


4

Крім відповіді "шо", що є правильним (четвертим параметром UIApplicationMain має бути ім'я головного контролера), я додаю кілька коментарів.

Нещодавно я змінив "модель" моєї програми з використання MainWindow.xib для програмного конструювання вікна. Додаток використовував старіший шаблон, який автоматично створив це MainWindow. Оскільки я хотів підтримати інший вигляд контролера XIB для iPhone 5, під час створення делегата додатків простіше вибрати правильний XIB. Я також видалив MainWindow.xib з проекту.

Проблема полягала в тому, що я забув заповнити четвертий параметр у головному застосуванні UIApplication, і Я ЗАБОРОНУЮ ВІДМОВИТИ MainWindow з "Основного інтерфейсу" в проектному резюме.

Це спричинило велику проблему: воно видало нешкідливе попередження "Очікується, що програми будуть ..." на пристроях розробки, але коли він перейшов до App Store, він зламався на споживчих телефонах і вийшов з ладу, оскільки MainWindow вже не було в комплекті! Мені довелося подати запит на прискорений огляд помилки.

Ще одне симптом полягає в тому, що іноді білий блок, як порожній UIView, іноді з'являвся, коли змінилися Налаштування та додано програму на перший план. В iPhone 5 було зрозуміло, що це блок 320x480. Можливо, відсутнє головне вікно створювалося в режимі розробки, використовуючи старий розмір. Я щойно знайшов цю помилку, коли перші повідомлення про аварію потрапили до папки "Вхідні".

Встановлення програми з App Store замість XCode показало, що програма справді вийшла з ладу, і проблема MainWindow виявилася в журналі, тож я міг бачити, що це не якась спеціальна комбінація пристроїв + версій IOS.


4

Щоб додати відповідь Майка Фліна, після оновлення до Xcode 7 та запуску програми на пристрої iOS 9 я додав це до свого (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;
    }
}

Мені цікаво дізнатись, скільки вікон у вашому додатку і чи всі вони мали контролер перегляду коренів. Дякую
DrAL3X

3

Ця проблема виникає, якщо у вас не встановлено програму Interface Builder правильно.

Переконайтесь, що вікно вашого представника додатка та представлення представлень представниківController підключено:

У головному вікні MainWindow.xib утримуйте контроль, натисніть Делегат додатка та перетягніть до об’єкта Вікно. Виберіть вікно. Утримуйте контроль і виберіть делегат додатка ще раз, перетягніть на свій кореневий контролер і виберіть viewController.


3

Ця помилка також з’являється, коли власник файлу MainWindow.xib встановлений неправильно.

Власником файлу є UIApplication
-> вставлений об’єкт класу делегата додатків із підключеним до вікна розеткою вікна


Я створив файл xib вручну і почав отримувати цю помилку. дякую купу!
RawMean
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.