2013-10-11 5 views
0

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

Приложение было создано как единое приложение просмотра, образец кода 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]; 
} 

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

- (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; 
} 

}

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

+0

Посмотрите на шаблон сдерживания зрения в ios. У Viewcontrollers могут быть подчиненные контроллеры со своими представлениями. Его очень аккуратный и элегантный способ взломать ваше приложение на небольшие подключаемые компоненты. –

ответ

0

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

Удачи вам!

+0

Должен ли я использовать добавление NavigationController к self.window в AppDelegate вместо self.Main? – Angie

+0

self.Main = [[vcMain alloc] initWithNibName: @ "vcMain" bundle: nil]; UINavigationController * nvController = [UInavigationController alloc] initwithRootViewController: self.Main]]; self.window.rootViewController = nvController; [self.window makeKeyAndVisible]; – Angie

+1

Да, вам нужно начинать с самонадеянного типа: 'self.homeViewController = [[HomeViewController alloc] initWithNibName: @" HomeViewController "bundle: nil]; self.mainNavigationController = [[UINavigationController alloc] initWithRootViewController: self.homeViewController]; self.window.rootViewController = self.mainNavigationController; [self.window makeKeyAndVisible]; ' –

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