2011-02-10 2 views
0

Я пытаюсь использовать этот код PDFScroller http://dl.dropbox.com/u/5391413/PDFScroller.zip (спасибо jbm). Я хотел бы отобразить pdf-файл из списка (tableview) с помощью navigationController. Я запускаю PhotoViewControler с именем файла pdf и отображаю его правильно. Проблема в том, что после того, как я однажды загрузил файл, мне не удается очистить refdoc ref, и это приводит к сбою после возврата в список просмотра и загрузке другого файла.с использованием PDFScroller с navigationController

Я попытался освободить pdfDoc ref или установить нуль в методе dealloc PhotoViewController, но он не работает. Еще одна вещь: метод viewDidUnload для PhotoViewController не вызывается при выводе viewController из стека навигационного контроллера ... это нормально?

благодаря

Г.

+0

после какой-то код, пожалуйста –

ответ

0

вот как я запускаю PhotoViewController от корня он ViewController:

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, __pdfDoc остается прежним даже после того, как PhotoViewController выскочил из стека navigationController, и это вызывает сбой. Я не там, где правильно его чистить.

благодаря

Гийом

Смежные вопросы