Приложение за 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 ви предлага добър начин за работа с различни viewControllers. Ако направите 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:dash animated:NO]; ViewActive = vDashboard; - person Angie; 11.10.2013
comment
Да, прав си. Ако имате някакъв проблем с това, можете да направите метода push in viewdidappear вместо viewdidload. - person Andrés Brun; 11.10.2013