Удалить ранее добавленные viewControllers из UIPageViewController

Я использую массив для добавления некоторых viewControllers в UIPageViewController. Проблема в том, что они остаются в памяти, когда вы проводите дальше, и я хочу их удалить. Я нашел этот метод делегата:

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    // If the page did not turn
    if (!completed)
    {
        return;
    }
    // This is where I want to delete the previousViewControllers to release memory
}

Но как мне удалить эти предыдущие ViewController'ы? Если вы прокрутите назад, они должны перезагрузиться, но мне нужно удалить их, потому что иначе они останутся в памяти все время.


person Shinonuma    schedule 24.04.2013    source источник
comment
UIPageViewController должен висеть максимум на 3 контроллерах (текущий, предыдущий, следующий), и вы никогда не должны (и на самом деле не можете) удалять те, за которые он держится. Если ваши контроллеры зависают дольше, возможно, это связано с тем, что вы сохраняете ссылку на них в том массиве, из которого их добавляете. После того, как вы передадите их UIPageViewController, вы сможете безопасно установить любой указатель, который у вас есть на viewController, на ноль, потому что UIPageViewController сохраняет на них сильный указатель.   -  person Charlie Price    schedule 24.04.2013


Ответы (1)


Я никогда не использовал UIPageViewController, но кажется, что previousViewControllers доступен только для чтения. Что бы я сделал, так это отправил сообщение предыдущим ViewController'ам, чтобы они перезагрузились.

Например, я считаю, что это позволит получить доступ к последнему отображаемому ViewController:

MyVC *lastVC = (MyVC*)[previousViewControllers objectAtIndex:[previousViewControllers count]-1];
lastVC.reloadFlag = YES; // Assuming you have a reloadFlag property in your MyVC class

Таким образом, вы можете указать это в методе, который у вас есть в вашем вопросе.

Затем убедитесь, что viewWillAppear вызывается в вашем объекте MyVC *, когда вы возвращаетесь к своему ViewController, и если это так, поместите в него простую вещь:

if(_reloadFlag) {
    //updateUI
}

Это просто идея, возможно, вам придется что-то изменить, чтобы она заработала.

person rdurand    schedule 24.04.2013
comment
Проблема в том, что viewControllers, добавленные в UIPageViewController, относятся к разным классам, например, не только MyVC, но и MyVC2, MyVC3, MyVC4 и т. д. - person Shinonuma; 24.04.2013
comment
Может быть, вы можете наследовать все свои классы VC от суперкласса, который будет иметь флаг в качестве свойства? - person rdurand; 25.04.2013
comment
Или вы добавляете флаг ко всем своим классам (если их не слишком много) и проверяете класс с помощью [lastVC isKindOfClass:@...] ? - person rdurand; 25.04.2013