Ответ 1
У меня была такая же проблема. Проверьте свой главный .m. Последнему аргументу должно быть присвоено имя класса, реализующего протокол UIApplicationDelegate.
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
В моей консоли появляется следующая ошибка:
Ожидается, что в конце запуска приложения ожидается контроллер корневого представления
Ниже мой метод 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 current view as a subview of the window
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
В Interface Builder делегат UITabBarController
подключается к App Delegate.
Кто-нибудь знает, как исправить эту проблему?
У меня была такая же проблема. Проверьте свой главный .m. Последнему аргументу должно быть присвоено имя класса, реализующего протокол UIApplicationDelegate.
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
Заменить в AppDelegate
[window addSubview:[someController view]];
к
[self.window setRootViewController:someController];
У меня была такая же ошибка при попытке изменить первый контроллер представления, который был загружен в
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- (void)viewDidLoad
к
- (void)viewDidAppear:(BOOL)animated
и ошибка перестала появляться. Моя проблема была вызвана, например, созданием UIAlertView
.
В вашем случае я предлагаю вам проверить код в контроллере активного вида tabBarController (поскольку это, вероятно, проблема в этом контроллере представления). Если это не сработает, попробуйте установить начальные настройки в файле nib вместо кода - или если вы хотите сделать это в коде, попробуйте переместить код в соответствующий метод управления viewBarController.
Удачи!
Это случилось со мной. Решено путем редактирования файла .plist. Укажите базовое имя основного файла nib (должно быть MainWindow.xib). Надеюсь, это поможет.
Я получил это, начиная с шаблона "Пустое приложение", а затем вручную добавляя XIB. Я решил это, установив основное имя Nib, предложенное Sunny. Отсутствующий шаг в этом сценарии удаляет
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
от
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Так как он перезапишет экземпляр вашего окна, созданного в файле Xib. Предполагается, что вы создали ViewController и подключили его к окну и делегату приложения в файле XIB.
Я сталкиваюсь с той же проблемой в последнее время при создании проекта с помощью 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;
}
Это будет работать только в том случае, если также будет реализовано решение sho.
Я обновился до 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;
}
}
Ни одно из вышеперечисленных предложений не решило мою проблему. Мой был следующим:
Добавить
window.rootViewController = navigationController;
после
[window addSubview:navigationController.view];
в моем appdelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {
как добавить RootViewController для iOS5
если ваше приложение до сих пор не использовало RootViewController,
просто создайте один;), нажав "Файл" > "Создать" > "Новый файл";
выберите UIViewController subclass
назовите его RootViewController, снимите флажок С XIB для пользовательского интерфейса (если у вас его уже есть)
и поместите этот код в свой AppDelegate:: didFinishLaunchingWithOptions
rootViewController = [[RootViewController alloc] init];
window.rootViewController = rootViewController;
наверняка - вам нужно импортировать RootViewController.h и создать переменную
вот хорошая статья о RootViewController и AppDelegate,
Убедитесь, что у вас есть эта функция в делетете приложения.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {
return YES;
}
Убедитесь, что didFinishLaunchingWithOptions возвращает YES. Если вам удалили строку "return YES", это приведет к ошибке. Эта ошибка может быть особенно распространена среди пользователей раскадровки.
У меня также была эта ошибка, но в отличие от любых ответов, перечисленных ранее, это потому, что я раскомментировал метод loadView в моем новом генераторе (xcode 4.2, ios5).
//Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{
}
Он даже сказал мне, что метод предназначен для создания представления программно, но я пропустил его, потому что он выглядел так же, как и другие методы, такие как viewDidLoad, которые я обычно использую, я его не поймал.
Чтобы решить, просто удалите этот метод, если вы не программно создаете иерархию представлений aka, используя nib или раскадровку.
У меня тоже есть проблемы. Я получил проект в xcode4.2.1. Я прочитал все комментарии там, но никто не классный для меня. через некоторое время я обнаружил, что я прокомментировал фрагмент кода.
//self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
то я расколол его. все в порядке для меня. надеюсь, это поможет вам, ребята.
Произошло небольшое изменение вокруг 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
}
Это заставляет предупреждение уйти и на самом деле не влияет на ваше приложение.
Попробуйте подключить IBOutlet контроллера панели вкладок к корневому представлению в Interface Builder вместо
self.window.rootViewController = self.tabBarController;
Но на самом деле я не видел такую ошибку раньше.
С моим первым представлением MenuViewController
я добавил:
MenuViewController *menuViewController = [[MenuViewController alloc]init];
self.window.rootViewController = menuViewController;
в методе делегирования приложения:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
}
Это сработало.
Я решил проблему, выполнив следующее (ни одно из вышеперечисленных решений не помогло):
Из раскрывающегося меню, связанного с "Основным интерфейсом", выберите другую запись, а затем повторно выберите "MainWindow", затем перестройте.
Я столкнулся с той же проблемой, но использовал storyboard
Назначение my storyboard
InitialViewController
моему окну rootViewController
.
В
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
UIStoryboard *stb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
self.window.rootViewController = [stb instantiateInitialViewController];
return YES;
}
и это решило проблему.
У меня возникла такая же проблема сразу после обновления до Xcode 4.3, и только при запуске проекта с нуля (т.е. создайте пустой проект, затем создайте UIViewController, а затем создайте отдельный файл nib).
После размещения всех строк, которые я использовал, и обеспечения правильных подключений, я продолжал получать эту ошибку, и файл nib, который я пытался загрузить через контроллер вида (который был установлен как rootController), никогда не показывался в симулятор.
Я создал единый шаблон представления через Xcode и сравнил его с моим кодом и НАКОНЕЦ нашел проблему!
Xcode 4.3 добавляет по умолчанию метод - (void) loadView; к разделу реализации контроллера просмотра. После тщательного чтения комментариев внутри него стало ясно, в чем проблема. Комментарий указывает на переопределение метода loadView при программном программировании (и я перефразирую), иначе НЕ переопределить loadView при использовании ниба. В этом методе ничего больше не было, поэтому во вред я переопределял метод (и ничего не делал) WHILE, используя файл nib, который дал ошибку.
РЕШЕНИЕ заключалось в том, чтобы полностью удалить метод loadView из раздела реализации или вызвать родительский метод, добавив [super loadView].
Удаление было бы лучше, если бы использование файла NIB, поскольку добавление какого-либо другого кода действительно заменит его.
В журнале было такое же сообщение об ошибке. У меня появилось UIAlertView в приложении: didFinishLaunchingWithOptions. Я решил это, отложив вызов alertView, чтобы дать возможность контроллеру корневого представления завершить загрузку.
В приложении: didFinishLaunchingWithOptions:
[self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0];
который вызывает через 1 секунду:
- (void)callPopUp
{
// call UIAlertView
}
У меня была та же проблема. Если вы создаете оконное приложение "с нуля", как и я, вам нужно сделать следующее: (обратите внимание, что это шаги для 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. Подключите все это в редакторе интерфейса
Выберите файл интерфейса в списке файлов, чтобы открыть редактор интерфейса.
Убедитесь, что панель "Утилиты" открыта.
Добавьте новый объект, перетащив объект из списка "Объекты" на панели "Утилиты" в пространство выше вашего объекта "Окно". Выберите объект. Нажмите "Инспектор удостоверений" на панели "Утилиты". Измените класс на делегат приложения (MyAppDelegate, в этом примере.)
Подключите инспектор соединений для MyAppDelegate. Подключите выход окна к окну, которое уже существует в файле интерфейса.
Нажмите "Владелец файла" слева, а затем нажмите "Инспектор удостоверений" на панели "Утилиты". Измените класс на UIApplication
Подключите инспектор соединений для владельца файла. Подключите выход делегата к объекту MyAppDelegate.
4. Наконец, и очень важно, щелкните объект Window в файле интерфейса. Откройте инспектор атрибутов. Убедитесь, что установлен флажок "Видимый при запуске".
Это все, что я должен был сделать, чтобы заставить его работать на меня. Удачи!
Если вы используете MTStatusBarOverlay, вы получите эту ошибку.
MTStatusBarOverlay создает дополнительное окно (окна [UIApplication sharedApplication]), в котором нет корневого контроллера.
Это не вызывает проблем.
Получена такая же ошибка после замены моего пользовательского интерфейса с помощью раскадровки, используя XCode 4.6.3 и iOS 6.1
Решил его, очистив весь код от didFinishLaucnhingWithOptions в AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
return YES;
}
OrdoDei дал правильный и ценный ответ. Я добавляю этот ответ только для того, чтобы привести пример метода 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 window. Then get the nav controller 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 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;
}
Это произошло для меня, потому что я непреднамеренно закомментировал:
[self.window makeKeyAndVisible];
от
- (BOOL)application:(UIApplication*) didFinishLaunchingWithOptions:(NSDictionary*)
Мне удалось установить начальный контроллер представления на сводном экране xcode.
Нажмите на самое верхнее имя проекта в левом файловом проводнике (у него должен быть небольшой значок). В центральном столбце щелкните название вашего проекта в разделе "TARGETS" (рядом с ним должен быть маленький значок "A" ). Посмотрите раздел "Информация о развертывании iPhone/iPod" и найдите "Основной интерфейс". Вы можете выбрать вариант из раскрывающегося списка.
В верхней части ответа "sho", это правильно (четвертый параметр UIApplicationMain должен быть именем основного контроллера), я добавляю несколько комментариев.
Недавно я изменил "модель" приложения my из MainWindow.xib, чтобы построить окно программно. В приложении использовался более старый шаблон, который автоматически создавал этот MainWindow. Поскольку я хотел поддерживать другой вид контроллера XIB для iPhone 5, проще выбрать правильный XIB программно, когда будет создан делегат приложения. Я также удалил MainWindow.xib из проекта.
Проблема заключалась в том, что я забыл заполнить четвертый параметр в главном UIApplication, и я ЗАБЫЛ ОТКЛЮЧИТЬ MainWindow из "основного интерфейса" в резюме проекта.
Это вызвало проблему BIG: это обеспечило безобидное предупреждение "Приложения, ожидаемые..." на устройствах разработки, но когда оно пошло в App Store, оно сломалось на потребительских телефонах, сбой, потому что MainWindow больше не был в комплекте! Мне пришлось запросить ускоренную проверку исправления.
Другой симптом заключается в том, что иногда белый блок, как пустой UIView, иногда появлялся при изменении настроек, и приложение было помещено на передний план. В iPhone 5 было ясно, что это блок 320x480. Возможно, отсутствующий MainWindow создавался в режиме разработки, используя старый размер. Я только что нашел эту ошибку, когда первые сообщения об аварии достигли папки "Входящие".
Установка приложения из App Store вместо XCode показала, что приложение действительно разбилось, и проблема MainWindow обнаружила себя в журнале, поэтому я мог видеть, что это не какая-то особая комбинация устройств + версии IOS.
Чтобы добавить к Mike Flynn ответ, начиная с обновления до 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;
}
}
Эта проблема возникает, если вы неправильно настроили Interface Builder.
Убедитесь, что вы открыли окно App Delegate и viewController:
В MainWindow.xib, удерживайте элемент управления, щелкните App Delegate и перетащите объект Window. Выберите окно. Удерживайте управление и снова выберите делегата приложения, перетащите его на контроллер корневого представления и выберите viewController.
Эта ошибка также появляется, когда владелец файла MainWindow.xib установлен неверно.
Владелец файла - это UIApplication
→ вставленный объект класса делегата приложения с выходом окна, подключенным к окну