2012-05-30 5 views
4

В AppDelegate я хочу создать подкласс UIViewController и добавить его в представление. Сам viw будет указан в коде - нет ниба.Создание контроллера представления без наконечника

Основываясь на яблоневых документы, я должен использовать

initWithNibName:nil bundle:nil]; 

, а затем в loadView контроллера, добавить свои подвидов и т.д.

Однако follwing тестовый код ниже не работает для меня , Я смоделировал код AppDelegate на Apple PageControl demo, просто потому, что мое приложение будет реализовывать аналогичную структуру (в частности, базовый контроллер для управления просмотром прокрутки по страницам и массив других контроллеров для создания страниц).

Но я подозреваю, что мой код AppDelegate является проблемой, поскольку ведение журнала доказывает, что initWithNibName :: и loadView оба огня. Приложение, как показано ниже, запускается, но экран пуст. Я ожидаю зелёный вид с этикеткой.

AppDelegate

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     ScrollerController *controller = [[ScrollerController alloc] initWithNibName:nil bundle:nil]; 
     [self.window addSubview:controller.view]; 
     [self.window makeKeyAndVisible]; 
     return YES; 
    } 

ScrollerController (подкласс UIViewController)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)loadView{ 
    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame]; 
    UIView *contentView = [[UIView alloc] initWithFrame:applicationFrame]; 
    contentView.backgroundColor = [UIColor greenColor]; 
    self.view = contentView; 

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 100, 40)]; 
    [label setText:@"Label created in ScrollerController.loadView"]; 
    [self.view addSubview:label]; 
} 
+0

Я заметил в демонстрационном проекте, который есть XIB с AppDelegate в качестве владельца fole по - видимому, это оказывает на приложение ту часть, которую я не хватает? –

+0

проверить, что ваш взгляд содержит после просмотраDidLoad – Sulthan

+0

Все, кажется, есть - self.view: > Subviews: 1 Subview 0: > –

ответ

5

Попробуйте использовать: self.window.rootViewController = controller; вместо [self.window addSubview:controller.view];

Обратите внимание, что вы должны также @synthesize window; и создать его self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

+0

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

+0

все зависит от того, создаете ли вы все программно или используете окно, которое находится в наконечнике. Если вы не используете окно в наконечнике, вам нужно создать окно программно, как предполагает Султан. – timthetoolman

+0

Жаль, что я мог бы много голосовать за это! Большое спасибо! – Mika

4

Вместо initWithNibNamed :, просто использовать Alloc и инициализации или любой из других назначенных initalizers для контроллера представления. Вот пример из project

hoverViewController=[[BDHoverViewController alloc] initWithHoverStatusStyle:BDHoverViewStatusActivityProgressStyle]; 
self.window.rootViewController=hoverViewController; 
[self.window makeKeyAndVisible]; 

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

self.window.rootViewcontroller=controller; 
[self.window makeKeyAndVisible]; 

Вы дон Не нужно добавлять представление к окну. Вышеприведенный код делает это автоматически.

Успехов,

T

+0

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

+0

Я прочитал его на SO, поэтому не обязательно авторитетный: 2a. Загрузка программного обеспечения программно Если вы решите переопределить -loadView, вы можете создать представление, подпункты, другие viewControllers и любые соединения между этими объектами любым способом. Конечно, это означает, что вы также отвечаете за управление памятью в отношении создаваемых объектов. Если ваш подкласс переопределяет -loadView, он должен быть инициализирован с использованием nil для nibName и bundle. ИСТОЧНИК: http://stackoverflow.com/questions/5107604/can-somebody-explain-the-process-of-a-uiviewcontroller-birth-which-method-follo –

+1

да, вы правы, я быстро посмотрел на docs, и это правильно. Чтобы быть в безопасности, я пытаюсь использовать метод initWithNibNamed:, только если я использую метод. Я обновил свой ответ. – timthetoolman

Смежные вопросы