Xcode 4 для чайников: почему настройки раскадровки не применяются при запуске приложения?

РЕШЕНИЕ

Убедитесь, что в plist имя раскадровки указано как имя основного файла раскадровки.


У меня есть класс Storyboard с классом UINavigationViewController, который подключен к классу NavigationViewController и установлен как класс UIWindow rootViewController. Когда приложение запускается (в симуляторе (5.1)) я получаю пустой черный экран с голубоватой панелью навигации вверху.

Первая проблема заключается в том, что в раскадровке я установил черный цвет панели навигации. Я также установил полупрозрачную черную строку состояния. Ни один из стилей не соблюдается при запуске приложения.

И вторая проблема заключается в том, что представление навигационного контроллера пусто, хотя в раскадровке оно связано с UITableViewController.

Как я могу исправить обе эти проблемы. Я только что снова начал использовать Xcode и раньше использовал 4.0, поэтому раскадровки сбивают меня с толку...

ОБНОВЛЕНИЕ

Вот код, как просили. Очевидно, я не могу опубликовать раскадровку (можно?).

AppDelegate:

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize navigationController;

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

navigationController = [[NavigationViewController alloc] init];

    self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
}

- (void)applicationWillTerminate:(UIApplication *)application {
}

@end

Навигационвиевконтроллер:

#import "NavigationViewController.h"

@interface NavigationViewController ()
@end

@implementation NavigationViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {
    }

    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewDidUnload {
    [super viewDidUnload];
}

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

person Gup3rSuR4c    schedule 23.06.2012    source источник


Ответы (1)


Проблема в том, что вы устанавливаете в качестве корневого контроллера совершенно пустой корневой контроллер, а не тот, что указан в раскадровке. Что вы хотите сделать, так это удалить эту часть кода и просто на раскадровке щелкнуть то, что говорит «является начальным контроллером представления»,

При использовании раскадровки вам обычно не нужно изменять appdelegate, потому что xcode устанавливает начальное представление, которое будет отображаться, и все это зависит исключительно от того, как вы устанавливаете раскадровку. Вы можете проверить это в plist, где указано, какая раскадровка будет использоваться в качестве основной.

Если вы хотите загрузить свой навигационный контроллер таким образом, вы можете сделать что-то подобное, вам нужно будет получить контроллер представления из самой раскадровки и представить его.

экземпляр ViewControllerWithIdentifier

но в этом нет необходимости при использовании раскадровок, поскольку он автоматически загружает тот, который установлен в качестве начального (который можно рассматривать как контроллер представления со стрелкой, указывающей на него)

Ваш метод делегата приложения должен выглядеть так

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
person Pochi    schedule 23.06.2012
comment
И вот как я понял, что раскадровки работают, но если я закомментирую назначение в AppDelegate, я просто получу пустой экран. Контроллер навигации был помечен как Is Initial View Controller с самого начала проекта, но ничего не отображается. Без назначения в AppDelegate я получаю совершенно пустой экран. По крайней мере, с заданием я получаю панель навигации... - person Gup3rSuR4c; 23.06.2012
comment
да, вы получаете его, потому что вы программно создаете его для показа, но он не имеет ничего общего с раскадровкой. Изменили ли вы что-нибудь еще из конфигурации? plist или настройки проекта? Добавьте кнопку или изображение в первый вид навигационного контроллера, чтобы увидеть, видите ли вы что-то - person Pochi; 23.06.2012
comment
На самом деле, чтобы проверить, есть ли у вас, просто добавьте обычный View CONtroller с 1 кнопкой, затем переместите стрелку на этот и посмотрите, видите ли вы его. если вы это сделаете, это означает, что вы неправильно настраиваете навигацию vc - person Pochi; 23.06.2012
comment
Попробовал тест, который вы предложили, и я все еще получаю пустой черный экран. Я также получаю эту ошибку: ожидается, что окна приложения будут иметь контроллер корневого представления в конце запуска приложения, поэтому я пытался назначить контроллер в делегате. - person Gup3rSuR4c; 23.06.2012
comment
НЕ БЕРИ В ГОЛОВУ! Я понял. Я только что вспомнил эту маленькую 2-секундную часть видео на YouTube, где создатель установил имя раскадровки в plist. Поскольку я начал с пустого проекта и вручную добавил раскадровку, поэтому она отсутствовала. В любом случае, вы правы насчет других вещей, поэтому я выберу ваш ответ. - person Gup3rSuR4c; 23.06.2012
comment
вы должны что-то изменить в своем проекте. Попробуйте новый проект и посмотрите, что вы изменили. - person Pochi; 23.06.2012