Приложение iOS с несколькими контроллерами представления

Мое текущее приложение на appDelegate загружает экран main.xib, который содержит только два изображения фона и логотип. Этот экран за кодом определяет, вошел ли пользователь в систему, если нет, он покажет логин, иначе он покажет панель инструментов.

Приложение было создано как приложение с одним представлением, пример кода appDelegate:

  // Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
{
    self.Main = [[vcMain alloc] initWithNibName:@"vcMain" bundle:nil];
    self.window.rootViewController = self.Main;
    [self.window makeKeyAndVisible];
}
else
{
    self.MainiPad = [[vcMain_iPad alloc] initWithNibName:@"vcMain_iPad" bundle:nil];
    self.window.rootViewController = self.MainiPad;
    [self.window makeKeyAndVisible];
}

На Main.m у меня есть следующее в viewDidLoad:

if (islogged)
{
     vcDashboard *vcDash = [[vcDashboard alloc] initWithNibName:@"vcDashboard" bundle:nil];
    _ncMain = [[UINavigationController alloc] initWithRootViewController:vcDash];
    _ncMain.navigationBar.barStyle = UIBarStyleBlackOpaque;
    _ncMain.view.frame = self.view.bounds;
    [self.view addSubview:_ncMain.view];
    ViewActive = vDash;
}
else
{
    vcLogin *login = [[vcLogin alloc] initWithNibName:@"vcLogin" bundle:nil];
    login.modalPresentationStyle = UIModalPresentationFormSheet;
    login.view.frame = self.view.bounds;
    [self presentViewController:login animated:YES completion:nil];
}

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

- (void)displayView:(NSString *)strView Notification:(NSNotification *)notification{

if(_ncMain)
{
    [_ncMain.view removeFromSuperview];
    _ncMain = nil;
}

if ([strView isEqual: @"Dashboard"])
{
    vcDashboard *vcDash = [[vcDashboard alloc] initWithNibName:@"vcDashboard" bundle:nil];
    _ncMain = [[UINavigationController alloc] initWithRootViewController:vcDash];
    _ncMain.navigationBar.barStyle = UIBarStyleBlackOpaque;
    _ncMain.view.frame = self.view.bounds;
    [self.view addSubview:_ncMain.view];
    ViewActive = vDash;
}
else if ([strView isEqual: @"Catalog"])
{
    vcCatalog *vcCat = [[vcCatalog alloc] initWithNibName:@"vcCatalog" bundle:nil];
    _ncMain = [[UINavigationController alloc] initWithRootViewController:vcCat];
    _ncMain.navigationBar.barStyle = UIBarStyleBlackOpaque;
    _ncMain.view.frame = self.view.bounds;
    [self.view addSubview:_ncMain.view];
    ViewActive = vCatalog;
}
else if ([strView isEqual: @"News"])
{
    vcNews *vcNew = [[vcNews alloc] initWithNibName:@"vcNews" bundle:nil];
    _ncMain = [[UINavigationController alloc] initWithRootViewController:vcNew];
    _ncMain.navigationBar.barStyle = UIBarStyleBlackOpaque;
    _ncMain.view.frame = self.view.bounds;
    [self.view addSubview:_ncMain.view];
    ViewActive = vNews;
}

}

Мои сомнения в том, что я, кажется, не знаю, является ли это правильным способом переключения между экранами, когда опция выбрана из этого меню, и правильно ли всегда добавлятьSubview на основной экран. Не знаю, является ли использование шаблона navigationcontroller решением. Меня беспокоит память, потребляемая приложением при выполнении всего этого, также я сейчас использую ARC в проекте.


person Angie    schedule 11.10.2013    source источник
comment
Посмотрите на шаблон сдерживания представления в ios. Контроллеры представления могут иметь подчиненные контроллеры представления со своими собственными представлениями. Это очень аккуратный и элегантный способ разбить ваше приложение на небольшие подключаемые компоненты.   -  person Zayin Krige    schedule 11.10.2013


Ответы (1)


Я рекомендую вам по возможности избегать метода addSubview. UiNAvigationController предлагает вам хороший способ управления различными viewController'ами. Например, если вы сделаете addSubview, событие changeRotation не будет вызвано. И когда вы делаете всплывающее окно, viewController освобождается.

Удачи!

person Andrés Brun    schedule 11.10.2013
comment
Должен ли я использовать добавление NavigationController в self.window в AppDelegate вместо self.Main? - person Angie; 11.10.2013
comment
self.Main = [[vcMain alloc] initWithNibName:@vcMain bundle:nil]; UINavigationController *nvController = [UInavigationController alloc]initwithRootViewController:self.Main]]; self.window.rootViewController = nvController; [self.window makeKeyAndVisible]; - person Angie; 11.10.2013
comment
Да, вы должны начать с того же, что и: self.homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil]; self.mainNavigationController = [[UINavigationController alloc] initWithRootViewController:self.homeViewController]; self.window.rootViewController = self.mainNavigationController; [self.window makeKeyAndVisible]; - person Andrés Brun; 11.10.2013
comment
Итак, на главном экране в viewDidLoad я бы сделал что-то вроде этого, поправьте меня, если я ошибаюсь: vcDashboard *dash = [[vcDashboard alloc] initWithNibName:@vcDashboard bundle:nil]; [self.navigationController pushViewController: анимация тире: НЕТ]; ViewActive = vDashboard; - person Angie; 11.10.2013
comment
Да, ты прав. Если у вас есть какие-либо проблемы с этим, вы можете использовать метод push in viewdidappear вместо viewdidload. - person Andrés Brun; 11.10.2013