Удаление помощи UIScrollView подпредставлений - PullRequest
1 голос
/ 24 июня 2010

Мне нужна помощь, чтобы правильно удалить подпредставления из прокрутки, чтобы уменьшить использование памяти. Каждый раз, когда пользователь прокручивает, я прошу захватить страницу, страницу -1 и страницу + 1, чтобы загрузить представления в виде прокрутки.

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

- (void)loadScrollViewWithPage:(int)page {
    if (page < 0) return;
    if (page >= [self favouritesCount]) return;
    // replace the placeholder if necessary
    MyObject *myObj = (MyObj *)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:page inSection:0]];
    MyView *controller = [viewControllers objectAtIndex:page];
    if ((NSNull *)controller == [NSNull null]) {
        controller = [[MyView alloc] initWithObject:myObj];
        controller.delegate = self;
        [viewControllers replaceObjectAtIndex:page withObject:controller];
    }
    // add the controller's view to the scroll view
    if (nil == controller.superview) {
        CGRect frame = scrollView.frame;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0;
        controller.frame = frame;
        [scrollView addSubview:controller];
    }
}

Теперь я попробовал что-то вроде:

if (page > 2) {
    [(UIView *)[[scrollView subviews] objectAtIndex:(page - 2)] removeFromSuperview];
}

Но это просто разбивает его. Это, вероятно, простое решение, поэтому помощь приветствуется:)

Ответы [ 3 ]

0 голосов
/ 24 июня 2010

Я думаю, что на вашем месте я бы просто добавил методы «loadData» и «releaseData» в свои представления и вызывал их, когда они входили и выходили из вида. Конечно, у вас все еще будут загружены классы представлений, но в этих методах вы можете избавиться (и повторно загрузить) более тяжелые подобъекты, которые содержат эти представления.

Удачи,
Блейк.

0 голосов
/ 29 июня 2010

Я думаю, что ваша проблема в решении, которое вы отправили:

[(UIView *)[[scrollView subviews] objectAtIndex:(page - 2)] removeFromSuperview];

Если вы удалите ранее загруженные представления, у вас всегда будет загружено 2 представления, поэтому вы не можете получить доступ к странице 2, так как в scrollview не загружены представления страницы 2. (например, когда страница 5, вы получите доступ к представлению 3 из scrollview)

Вы должны рассмотреть 2 вещи:

1.- Вместо этого используйте [[[viewControllers objectAtIndex:page-2] view] removeFromSuperview]; (посмотрите, что здесь я использую viewcontrollers вместо scroll.subviews)

2.- Удалите view из viewcontrollers array, потому что простое удаление представления из прокрутки не приведет к освобождению представления из памяти (оно сохраняется в массиве). Для этого используйте что-то вроде:

[viewControllers replaceObjectAtIndex:page-2 withObject:[NSNull null]];
0 голосов
/ 24 июня 2010

Вы увеличивали pageCount?

Вы также можете попробовать это:

MyView *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller != [NSNull null]) {
   [controller removeFromSuperView];
}

Некоторые примечания к соглашению об именах: Контроллер MyView * не имеет смысла. Если MyView является подклассом UIView, вы должны указать только имя, если MyView * view

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