uiview не отображается в делегате приложения

Когда я выполняю приведенный ниже код в симуляторе, я ожидаю, что экран заполнится красным, но вместо этого он весь черный, почему?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  UIView * myView = [[UIView alloc] initWithFrame:[window bounds]];
  [myView setBackgroundColor:[UIColor redColor]];
  [window addSubview:myView];
  [window makeKeyAndVisible];
  return YES;
}

Если я добавлю инициализацию окна, это не поможет:

window = [[[UIWindow alloc] init] initWithFrame:[[UIScreen mainScreen] bounds]];

Мои проблемы начались, когда после создания универсального проекта на основе окна в Xcode я решил удалить xib-файлы iPad/iPhone и файлы делегата приложения iPhone/iPad, которые были автоматически созданы в проекте, и вместо этого иметь один делегат приложения с представлением контроллер, который программно строит представление на основе устройства. Теперь я не могу отобразить простое представление, которое я создаю в делегате приложения.

Изменить: я удалил добавление представления и теперь установил красный цвет фона окна. Это не помогает, но если я перейду на рабочий стол в симуляторе и снова открою работающее приложение, я увижу красный экран. Опять же, я озадачен тем, почему я не вижу красный цвет при первом запуске приложения.


person andrewz    schedule 11.12.2010    source источник


Ответы (2)


Вот шаги по настройке универсального проекта iOS, отличного от InterfaceBuilder (.xib).

  1. Удалите все ассоциации с файлами .xib в списке свойств для приложения. Удалить ссылки на файлы .xib из списка приложений

  2. Удалите все файлы .xib из проекта.

  3. (Необязательно) Создайте общий класс Application Delegate, а затем удалите файлы AppDelegate_iPad.* и AppDelegate_iPhone.*. (Скопируйте и вставьте любой код из существующих файлов перед удалением)
  4. Измените файл main.m, указав имя делегата приложения. Я решил изменить и использовать AppDelegate_iPhone для примера. См. документацию: Справочник по приложению UI

    // main.m int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    // Start an iPhone/iPad App using a .xib file (Defaults set in .plist)
    //int retVal = UIApplicationMain(argc, argv, nil, nil);
    
    // Start the iPhone/iPad App programmatically
    // Set the 3rd argument to nil, to use the default UIApplication
    // Set the 4th argument to the string name of your AppDelegate class
    int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_iPhone");
    
    [pool release];
    return retVal;
    

    }

  5. Обновите код делегата приложения.

    // AppDelegate_iPhone.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        // Override point for customization after application launch.
        NSLog(@"Launch my application iphone");
    
        // Create the window, it's not created without a nib
        window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    
        // Create a subview that is red
        UIView *myView = [[UIView alloc] initWithFrame:[window bounds]];
        [myView setBackgroundColor:[UIColor redColor]];
    
        // Add the subview and release the memory, sicne the window owns it now
        [self.window addSubview:myView];
        [myView release]; 
    
        [self.window makeKeyAndVisible];
    
        return YES;
    }
    
person Paul Solt    schedule 11.12.2010
comment
Это отличный ответ, в котором описаны шаги, которые я предпринял, но более подробно. Оказывается, моя ошибка заключалась в двойной инициализации UIWindow (см. выше). Теперь все работает. Спасибо за отличный ответ. - person andrewz; 11.12.2010
comment
Не за что, меня это расстраивало, когда я только начинал, так как есть несколько шагов и мест для редактирования настроек/кода проекта. Я не уверен, почему, но с моей стороны код отформатирован неправильно, хотя я пытался пометить его как код. - person Paul Solt; 12.12.2010

Я попытался запустить ваш код, и это сработало для меня. Я получил пустой вид, окрашенный в красный цвет. Пробовали ли вы добавлять точки останова и проверять, что ваш код действительно выполняется? В противном случае единственное, что я могу придумать, это то, что это что-то с вашим UIWindow.

person ehenrik    schedule 11.12.2010
comment
Я понял, в чем проблема, я неправильно инициализировал окно, я сделал двойную инициализацию, например так: [[[UIWindow alloc] init] initWithFrame:bounds]. Как только я удалил первую инициализацию, она заработала. Я потратил более 6 часов на это LOL. Спасибо! - person andrewz; 11.12.2010
comment
иногда вам просто нужно оставить клавиатуру на некоторое время и вернуться позже. Рад слышать, что вы решили это. - person ehenrik; 12.12.2010