Как избавиться от старого контроллера при переходе между двумя видами? - PullRequest
0 голосов
/ 15 марта 2011

Я пытаюсь создать переход между двумя представлениями, используя их контроллеры.Проблема в том, как избавиться от старого контроллера после завершения анимации перехода?Я не могу избавиться от него до завершения анимации, так как это приводит к ошибке сегментации - очевидно, что задействованные анимации не увеличивают счетчик сохранности для представлений, с которыми они работают.

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

Вот мой пример кода для метода в моем контроллере корневого представления:

-(void) switchToController:(UIViewController *) controller {
    [controller viewWillAppear:YES];

    if (self.currentScreenController != nil) {
        [self.currentScreenController viewWillDisappear:YES];
        [[self.currentScreenController view] removeFromSuperview];
    }

    [self.view addSubview:[controller view]];

    if (self.currentScreenController != nil) {
        [self.currentScreenController viewDidDisappear:YES];
    }

    self.currentScreenController = controller;

    [controller viewDidAppear:YES];

    //[controller release]; // <- releasing now will cause errors as subsequent animations reference this controller's view
    ...
    // animations start now

[Edit] Ну, я не могу показатьсяполучить разрешение на освобождение контроллера даже после окончания анимации по какой-то необъяснимой причине.Я планирую вызов NSTimer через несколько секунд после завершения анимации, проверяю, что счетчик сохранения равен 1, прежде чем выпускать, а затем, когда я его отпускаю, у меня происходит сбой.Вот метод, который вызывается таймером для освобождения уже неиспользуемых контроллеров:

- (void) releaseOldController {
    @synchronized(arrayOfOldControllers) {
    if (2 < [arrayOfOldControllers count]) {
        NSObject * object = [arrayOfOldControllers objectAtIndex:0];
        [arrayOfOldControllers removeObjectAtIndex:0];
        NSLog(@"releasing object (%@) with retain count(%d)", object, [object retainCount]);
        [object release];
    }
}

}

Возможно, моя стратегия неверна.То, что я пытаюсь сделать, это смоделировать перелистывание страниц книги.В книге более 30 страниц, я хочу избавиться от старой страницы, как только переход к новой странице закончится, чтобы освободить память.Поэтому, когда пользователь переходит на новую страницу, создается новый контроллер с новым видом и добавляется к корневому контроллеру с переходом анимации замирания примерно в 1/2 секунды.Как только анимация закончится, я хочу освободить предыдущий просмотр страницы, так как виден только новый просмотр страницы.Таким образом, представление корневого контроллера одновременно может содержать не более 2 подпредставлений и, как правило, только 1 - текущую страницу, просмотренную после завершения перехода.Это не должно быть так сложно сделать, но я не понимаю, почему я получаю сообщение об ошибке при освобождении контроллера, когда он больше не используется.

[Обновление] Этот вопрос неправильный - проблема в том, чтогде-то еще и не имеет ничего общего с контроллером или представлением.Код выше правильный.

Ответы [ 2 ]

0 голосов
/ 20 марта 2011

Если вы пытаетесь смоделировать перелистывание страниц, я загружаю все свои контроллеры в NSMutableArray и использую его как руководство по страницам.Вы можете освободить все контроллеры UIViewControllers после добавления их в массив, и тогда у вас будет возможность иметь к ним доступ, когда вы захотите вернуться назад.

0 голосов
/ 15 марта 2011

Предоставление анимации завершенным методом обратного вызова, безусловно, будет работать, но это немного раздражает.

Более приятная техника, доступная вам: если вы ориентируетесь только на iOS4 и более поздние версии, вы можете использовать блоки анимации - см. Рекомендации по анимации iPhone UIView - в частности, бит completion: позволяет указать, что происходит в конце анимации, без необходимости определять новый метод обратного вызова обычным способом.

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