ユーザーがテーブルビューに持っているオブジェクトの数に応じて、スクロールビューに多くのビューコントローラーをロードしたアプリがあります。したがって、テーブルビューとスクロール ビューを切り替えると、ユーザーがテーブルビューに持っているオブジェクトの数に応じて、スクロール ビューのビュー コントローラーの数が変わります。
Apple の PageControl サンプル コードのコードを使用して、いくつかの変更を加えた後、内部に多数のビュー コントローラーを含むスクロール ビューを作成します。
- (void)loadScrollViewWithPage:(int)page
{
if (page < 0) return;
if (page >= kNumberOfPages) return;
// replace the placeholder if necessary
MainViewController *countdownController = [viewControllers objectAtIndex:page];
if ((NSNull *)countdownController == [NSNull null])
{
id occasion = [eventsArray objectAtIndex:page];
countdownController = [[MainViewController alloc] initWithPageNumber:page];
[countdownController setOccasion:occasion];
[viewControllers replaceObjectAtIndex:page withObject:countdownController];
[countdownController release];
}
// add the controller's view to the scroll view
if (nil == countdownController.view.superview)
{
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
countdownController.view.frame = frame;
[scrollView addSubview:countdownController.view];
}
}
問題は、もちろんメモリの問題を引き起こす新しいオブジェクトを追加しなかったにもかかわらず、テーブル ビューとスクロール ビュー (Instruments によると) を切り替えると、生きているビュー コントローラー (ここでは MainViewController) の数が増え続けることです。
私はスクロールビューのviewWillDisappearで非常に多くのことを試しました:
- (void) viewWillDisappear:(BOOL)animated
{
//test unloading all views
//Remove all subviews
[[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
//[[scrollView subviews] makeObjectsPerformSelector:@selector(release)];
//[viewControllers removeAllObjects];
for (unsigned m = 0; m < [viewControllers count]; m++)
{
//[[viewControllers objectAtIndex:m] makeObjectsPerformSelector:@selector(release)];
[viewControllers removeObjectAtIndex:m];
}
}
しかし、うまくいきませんでした。これは、アプリがどのように機能するかの記録です youtube.com/watch?v=5W8v_smZSog
これは、スクロール ビューの viewWillAppear メソッドです。
- (void)viewWillAppear:(BOOL)animated
{
eventsArray = [[NSMutableArray alloc] init];
kNumberOfPages = [self.dataModel occasionCount];
//update the eventsArray from the dataModel
//Fill in the events Array with occasions form the data model
for (unsigned r = 0; r < kNumberOfPages; r++)
{
Occasion* occasion = [self.dataModel occasionAtIndex:r];
[eventsArray insertObject:occasion atIndex:r];
}
// view controllers are created lazily
// in the meantime, load the array with placeholders which will be replaced on demand
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++)
{
[controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
[controllers release];
// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;
pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = currentPage;
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}
更新: インストゥルメントのビデオ録画http://www.youtube.com/watch?v=u1Rd2clvMQE&feature=youtube_gdata_player
そして、責任ある呼び出し元を示すスクリーン ショット:
ありがとうございました。