Шаблон дизайна iPhone и проблема управления памятью - PullRequest
0 голосов
/ 08 июля 2011

В моем приложении для iPad у меня есть один UINavigationController и несколько viewController, действующих как вкладки. Я не использую UITabbarController, так как я хотел определенный пользовательский вид вкладок, поэтому загружал различные контроллеры, которые являются подклассом одного UITableViewController, который инкапсулирует всю логику табличного представления и ячеек при нажатии кнопок значков, действующих как вкладки на нижняя часть экрана.

Глядя на дизайн, который я реализовал, мне действительно не нужен навигационный контроллер, поскольку мне не нужно выдвигать / выдвигать представления [что я делаю сейчас] и хочу, чтобы один viewController присутствовал там одновременно.

Что я сделал сейчас:

  1. В моем методе didFinishLaunchingWithOptions в моем appDelegate я выделяю свой контроллер навигации как:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
    UINavigationController *navigationVC = [[UINavigationController alloc]init];
    navigationVC.navigationBarHidden = YES;
    navigationVC.navigationBar.barStyle = UIBarStyleBlack;
    self.navigationController = navigationVC;
    [window addSubview: [self.navigationController view]];
    [navigationVC release];
    
    //set orientation as portrait
    self.currentOrientationType = PORTRAIT;
    
    //start with launch screen view controller
    [self setViewController:LAUNCH param:nil];
    
         return YES;
    }
    

И в моем методе setViewController: param: в зависимости от переданного ему идентификатора загружается соответствующий viewController, как показано ниже:

- (void)setViewController:(NSString *)ID param:(NSString *)param {

UIViewController *viewController;

     if(ID == HOME) {
        viewController = [[HomeScreenViewController alloc]initWithNibName:@"HomeScreenViewController" bundle:nil];
     }

    else if(ID == ...){
    }

    ...

   //push the specified view controller
[self setTransitionType:nil];

[[self navigationController] initWithRootViewController:viewController];
[viewController release];
  }
}

То, что происходит, - это любой из моих viewControllers, таким образом инициированный, поскольку rootViewControllers не освобождаются. Кажется, что запускать navigationController каждый раз для каждого нового viewController таким образом неправильно, поскольку он сохраняет ссылку на его корневой контроллер представления, и я инициализирую его снова и снова, не обращая внимания на счетчик ссылок, который он сохранял в предыдущем viewController.

Что может быть лучше, так как мне нужен только один viewController в любой момент времени?

1 Ответ

1 голос
/ 08 июля 2011

Согласно документу Apple, initWithRootViewController создает новый экземпляр контроллера навигации. Вы создаете новый экземпляр контроллера навигации каждый раз, когда вызываете свой метод setViewController. Вместо этого вам нужно создать его с помощью initWithRootViewController и использовать метод PushViewController после этого для представления, которое вы хотите быть активным.

...