删除UIScrollView子视图帮助

时间:2010-06-24 03:08:20

标签: iphone uiview uiscrollview

我想帮助您从滚动视图中正确删除子视图,以减少内存使用量。每次用户滚动时,我都会要求抓取页面-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 :(得分:0)

你是否增加了pageCount?

你也可以试试这个:

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

命名约定的一些注意事项:MyView *控制器没有意义。如果MyView是UIView的子类,则只应命名MyView * view

答案 1 :(得分:0)

我想如果我是你,我会在我的视图中添加“loadData”和“releaseData”方法,并在它们进入和退出视图时调用它们。当然,您仍然会加载视图类,但在这些方法中,您可以摆脱(并重新加载)这些视图包含的更重量级的子对象。

祝你好运,
布雷克。

答案 2 :(得分:0)

我认为您的问题出在您发布的解决方案中:

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

如果删除以前加载的视图,则始终会加载2个视图,因此您无法访问第2页,因为scrollview中没有加载第2页视图。 (例如,当页面为5时,您将从scrollview

访问视图3

你应该考虑两件事:

1.-使用[[[viewControllers objectAtIndex:page-2] view] removeFromSuperview];代替(在这里我使用viewcontrollers代替scroll.subviews

2.-从view中删除viewcontrollers array,因为仅从滚动中删除视图不会从内存中释放视图(由数组保留)。为此,请使用以下内容:

[viewControllers replaceObjectAtIndex:page-2 withObject:[NSNull null]];