2011-02-10 3 views
0

このPDFScrollerコードhttp://dl.dropbox.com/u/5391413/PDFScroller.zip(感謝jbm)を使用しようとしています。私はnavigationControllerのおかげで、リスト(テーブルビュー)からpdfを表示したいと思います。私はpdfファイル名でPhotoViewControlerを初期化し、正しく表示します。問題は、一度ファイルをロードした後、pdfDoc refをクリーンアップすることができず、ビューリストに戻って別のファイルをロードした後にクラッシュすることです。navigationControllerでPDFScrollerを使用する

私はpdfDoc refをリリースしようとしました、またはPhotoViewController deallocメソッドでnilに設定しましたが動作しません。 もう1つ:NavControllerスタックからviewControllerをポップするときに、PhotoViewControllerのviewDidUnloadメソッドが呼び出されません...それは普通ですか?ここ

おかげ

G.

+0

は、いくつかのコードを投稿してください –

答えて

0

は、私は彼のルートのViewControllerからPhotoViewControllerを起動する方法です:

PhotoViewController *detailViewController = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil pdfName:tmpName]; 
// Pass the selected object to the new view controller. 
[self.navigationController pushViewController:detailViewController animated:YES]; 
[detailViewController release]; 

tmpNameは、PDFファイルの名前が含まれている、私はPhotoViewControllerにプロパティを設定しますこれはPhotoViewControllerの実装です(元のサンプルコードとは少し異なります)。

- (void)loadView 
{  
    // Step 1: make the outer paging scroll view 
    CGRect pagingScrollViewFrame = [self frameForPagingScrollView]; 
    pagingScrollView = [[UIScrollView alloc] initWithFrame:pagingScrollViewFrame]; 
    pagingScrollView.pagingEnabled = YES; 
    pagingScrollView.backgroundColor = [UIColor blackColor]; 
    pagingScrollView.showsVerticalScrollIndicator = NO; 
    pagingScrollView.showsHorizontalScrollIndicator = NO; 
    pagingScrollView.contentSize = CGSizeMake(pagingScrollViewFrame.size.width * [self pdfPageCount], 
               pagingScrollViewFrame.size.height); 
    pagingScrollView.delegate = self; 
    self.view = pagingScrollView; 


    // Step 2: prepare to tile content 
    recycledPages = [[NSMutableSet alloc] init]; 
    visiblePages = [[NSMutableSet alloc] init]; 
    [self tilePages]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    [pdfName release]; 
    pdfName = nil; 
    [pagingScrollView release]; 
    pagingScrollView = nil; 
    //CGPDFDocumentRelease(__pdfDoc); 
    //__pdfDoc = nil; 
    [recycledPages release]; 
    recycledPages = nil; 
    [visiblePages release]; 
    visiblePages = nil; 
} 

- (void)dealloc 
{ 
    NSLog(@"dealloc"); 
    [pdfName release]; 
    [pagingScrollView release]; 
    [super dealloc]; 
} 

- (void)tilePages 
{ 
    // Calculate which pages are visible 
    CGRect visibleBounds = pagingScrollView.bounds; 
    int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds)/CGRectGetWidth(visibleBounds)); 
    int lastNeededPageIndex = floorf((CGRectGetMaxX(visibleBounds)-1)/CGRectGetWidth(visibleBounds)); 
    firstNeededPageIndex = MAX(firstNeededPageIndex, 0); 
    lastNeededPageIndex = MIN(lastNeededPageIndex, [self pdfPageCount] - 1); 

    // Recycle no-longer-visible pages 
    for (ImageScrollView *page in visiblePages) { 
     if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex) { 
      [recycledPages addObject:page]; 
      [page removeFromSuperview]; 
     } 
    } 
    [visiblePages minusSet:recycledPages]; 

    // add missing pages 
    for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) { 
     if (![self isDisplayingPageForIndex:index]) { 
      ImageScrollView *page = [self dequeueRecycledPage]; 
      if (page == nil) { 
       page = [[[ImageScrollView alloc] init] autorelease]; 
      } 
      [self configurePage:page forIndex:index]; 
      [pagingScrollView addSubview:page]; 
      [visiblePages addObject:page]; 
     } 
    } 
} 

- (void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index 
{ 
    page.index = index; 
    page.frame = [self frameForPageAtIndex:index]; 

    // Use tiled images 
    [page displayTiledImageNamed: [self pdfPage: index] 
          size: [self pdfSize: index]]; 
} 

static CGPDFDocumentRef __pdfDoc = nil; 

- (CGPDFPageRef) pdfPage: (NSInteger) index { 
    if(! __pdfDoc) { 
     NSString *pdfPath = [[NSBundle mainBundle] pathForResource: pdfName ofType:nil]; 
     CFURLRef url = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)pdfPath, 
     kCFURLPOSIXPathStyle, NO); 
     __pdfDoc = CGPDFDocumentCreateWithURL(url); 

    } 
    if(__pdfDoc) { 
     size_t pdfPageCount = CGPDFDocumentGetNumberOfPages(__pdfDoc); 
     index++; // incoming param is zero-based, CGPDF calls are 1-based 
     if(index < 1) 
      index = 1; 
     if(index > pdfPageCount) 
      index = pdfPageCount; 
     CGPDFPageRef page = CGPDFDocumentGetPage(__pdfDoc, index); 
     return page; 
    } 
    return nil; 
} 

-(IBAction)backToListView{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

問題:- (CGPDFPageRef) pdfPage: (NSInteger) indexメソッドでは、PhotoViewControllerがnavigationControllerスタックからポップされた後も__pdfDocが同じままであり、クラッシュが発生します。私はそれを正しくきれいにすることはできません。

おかげ

ギヨーム

関連する問題