Multiview приложение создает новые viewControllers каждый раз, когда я переключаю страницы? - PullRequest
0 голосов
/ 21 ноября 2011

Я использую навигационный контроллер и выдвигаю новые контроллеры представления для переключения между многостраничными приложениями Iphone. Как следует;

- (IBAction)startButton:(id)sender{
    GoalViewController *thisGoalViewController = [[GoalViewController alloc] 
                                                  initWithNibName:@"GoalViewController" bundle:nil];
    self.goalViewController = thisGoalViewController;
    [thisGoalViewController release];
    [[self navigationController] pushViewController:self.goalViewController animated:YES ];
}

Все отлично работает. Но когда я ставлю

 NSLog(@"Goal View ID: %p",self); 

в методе GoalViewController viewDidLoad я получаю разные значения при каждом переключении страниц.

В GoalViewController я использую это для возврата назад;

- (IBAction)backButton:(id)sender{   
    [(UINavigationController*)self.parentViewController popViewControllerAnimated:YES];
}

Как я уже сказал, все работает отлично, но я думаю, что я создаю новые экземпляры GoalViewController каждый раз, когда я нажимаю, чтобы посетить экран. Метод viewDidUnload в GoalViewController никогда не вызывается, поэтому я думаю, что они никогда не будут выпущены и в конечном итоге вызовут сбой. Однако я не смог разбить его, переключая страницы много-много раз.

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

Я думаю, что я ищу способ проверить, открыт ли все еще целевой контроллер goalViewController, на который я нажал, и переключиться на него вместо выделения нового.

Я был бы очень признателен за понимание этого. Спасибо, Грег

приписка

Я действительно пытался вставить это в методы viewWillAppear.

`NSMutableArray *allControllers = [[NSMutableArray alloc]     initWithArray:self.navigationController.viewControllers];
    NSLog(@"Controllers: %@",allControllers);`

Когда я переключаюсь между представлениями цели-заставки, это вывод, который я получаю. Идентификатор Splash View остается содержимым, но идентификатор Goal View меняется каждый раз.

2011-11-21 01:14:51.388 Controllers: ("<SplashViewController: 0x64468c0>")
2011-11-21 01:14:51.389 Controllers: <SplashViewController: 0x64468c0>
2011-11-21 01:14:58.494 Controllers: <GoalViewController: 0x6458ad0>
2011-11-21 01:14:58.495 Controllers: (
    "<SplashViewController: 0x64468c0>",
    "<GoalViewController: 0x6458ad0>"
)
2011-11-21 01:15:06.898 Controllers: <SplashViewController: 0x64468c0>
2011-11-21 01:15:11.139 Controllers: <GoalViewController: 0x5771660>
2011-11-21 01:15:11.140 Controllers: (
    "<SplashViewController: 0x64468c0>",
    "<GoalViewController: 0x5771660>"

Спасибо, Грег

1 Ответ

0 голосов
/ 21 ноября 2011

Вы действительно создаете новый контроллер каждый раз, когда вызываете

[[GoalViewController alloc] initWithNibName:@"GoalViewController" bundle:nil]

Вместо этого я бы предложил создать ваш GoalViewController один раз, вне вашего метода startButton (как в вашемметод viewWillAppear родительского контроллера представления) и сохраните его как переменную-член родительского объекта.Затем вы можете нажать и вставить его в свое удовольствие, и идентификатор просмотра цели будет оставаться одним и тем же указателем каждый раз.

Не забудьте освободить ваш GoalViewController, когда родительский объект освобожден или выгружен (не уверен, есливы используете ARC или нет).

Надеюсь, эта информация поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...