2010-06-24 66 views
1

我想要一些幫助,以正確地從滾動視圖中刪除子視圖,以減少內存使用量。每次用戶滾動時,我都會要求抓取頁面,頁面-1和頁面+ 1以獲取在滾動視圖中加載的視圖。刪除UIScrollView子視圖幫助

現在我的問題是,如果有十個並排的視圖,當您到達第十個視圖時,所有先前的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]; 
} 

但是,這只是崩潰了。這可能是一個簡單的解決方案,所以幫助表示讚賞:)

回答

0

您增加了pageCount?

你可以用這個嘗試,以及:

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

一些筆記命名約定:MyView的*控制器是沒有意義的。如果MyView是UIView的子類,你應該只命名如果MyView *查看

+0

謝謝,請試試。 是的,我實際上並沒有將它命名爲MyView - 只是將名稱用於共享目的,因爲類名太誇張,項目在NDA下。 – runmad 2010-06-24 13:42:02

+0

似乎沒有做這項工作?還有誰? – runmad 2010-06-24 14:40:47

+0

嗡嗡聲,聽起來很奇怪。視圖有問題。我想我需要查看更多的代碼 – vodkhang 2010-06-24 15:15:54

0

我想如果我是你,我只需在我的視圖中添加「loadData」和「releaseData」方法,並在他們來時調用它們進出視野。當然,您仍然會加載視圖類,但在這些方法中,您可以擺脫(並重新加載)這些視圖包含的更重量級的子對象。

祝你好運,
布萊克。

0

我覺得你的問題是在您發佈的解決方案:

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

如果刪除了以前加載的意見,你總是有加載2次,所以你不能訪問頁面-2,因爲你沒有頁面2的意見加載在scrollview。 (想例如當網頁是5,你會從scrollview訪問視圖3)

你應該考慮兩件事情:

1.-使用[[[viewControllers objectAtIndex:page-2] view] removeFromSuperview];代替(看一看,在這裏我用的viewcontrollers代替scroll.subviews

2.-從viewcontrollers array中刪除view,因爲只是從滾動中刪除視圖不會從內存中釋放視圖(它由數組保留)。爲此,請使用類似於:

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

對不起,我沒有意識到你的viewcontrollers數組實際上是一個視圖數組。所以,不要使用[[[[viewControllers objectAtIndex:page-2] view] removeFromSuperview];使用[[viewControllers objectAtIndex:page-2] removeFromSuperview];代替 – 2010-06-28 22:05:51