2012-03-07 2 views
2

Итак, я понимаю, что было много вопросов относительно использования UIWebView для отображения PDF-файла в приложении (на iPad). Я просмотрел все, что могу найти, но я не могу найти никакого удовлетворения.Отображение PDF с UIWebView не работает

То, что я пытаюсь сделать, очень просто, поэтому я действительно не знаю, почему он не работает. Все, что мне нужно сделать, это отобразить локально сохраненный PDF-файл в UIWebView. По сути, все, что я получаю, это черный экран. Если бы кто-то мог взглянуть на мой код, я бы очень признателен. Благодарю.

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    // Segue to the materials screen. 

    if ([segue.identifier isEqualToString:@"materials"]) { 
     PDFViewController *pdfViewController = [segue destinationViewController]; 

     NSIndexPath *path = [self.tableView indexPathForSelectedRow]; 
     int row = [path row]; 
     Lesson *selected = [purchasedLessons objectAtIndex:row]; 
     pdfViewController.selectedLesson = selected ; 

    //Start Load PDF in UIWebView 

     pdfViewController.pdfWindowTitle.title = selected.titleAndSubtitle; 

     pdfViewController.pdfWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1024, 704)]; 

     NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"moonlightSonataFirstMovement" ofType:@"pdf"]; 
     NSURL *url = [NSURL fileURLWithPath:urlAddress]; 

     NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

     [pdfViewController.pdfWebView loadRequest:requestObj]; 

    //End Load PDF 

    } 
} 

Я проверил, чтобы увидеть, если мой объект принести передается в сцене должным образом (и это), и если я получаю правильный запрос из; Я получаю:

<NSURLRequest file://localhost/Users/MYCOMPUTER/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/AB161E57-D942-44C2-AA75-030087820BED/iLessons%20Piano.app/moonlightSonataFirstMovement.pdf>

Кроме того, у меня есть сообщение об ошибке:

iLessons Piano[23080:f803] DiskImageCache: Could not resolve the absolute path of the old directory. 

Кроме того, сообщение NSLog получает распечатанный 8 раз по какой-то причине.

Единственное, что я могу придумать, это то, что мне нужно выполнить эту загрузку, когда я вызываю функцию prepareForSegue в предыдущей сцене. Это или использовать другой метод, как кварц. Но я предпочел бы использовать UIWebView, так как все, что мне действительно нужно сделать, это отображать и разрешать прокрутку.

+0

Просто подумайте, правильно ли это имя? Путь устройства всегда чувствителен к регистру. – cocoakomali

+0

Да, мне жаль, что это было просто имя файла. Я проверил его несколько раз. Он соответствует :(Это «moonlightSonataFirstMovement.pdf». – Barks

+0

Я попытался переместить код в функцию prepareForSegue, но все равно ничего. Просто черный экран. – Barks

ответ

1

им не уверен, что происходит .. просматривать и WebView как холдинговая значение ноль .., как я сказал, вы им не участвует в раскадровке еще .. но вы как решение обходной возможно это исправить вашу проблему

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1027, 768)]; 
    pdfViewController.view = view; 
    pdfViewController.pdfWebView = [[UIWebView alloc] initWithFrame:pdfViewController.view.frame]; 

    NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"moonlightSonataFirstMovement" ofType:@"pdf"]; 
    NSURL *url = [NSURL fileURLWithPath:urlAddress]; 

    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

    [pdfViewController.view addSubview:pdfViewController.pdfWebView]; 
    [pdfViewController.pdfWebView loadRequest:requestObj]; 
+0

Это сработало как шарм! Я просто бросил его в функцию prepareForSegue и вуаля. Должно быть, я не создавал рамки для рендеринга или что-то еще. Мне придется порвать это в какой-то момент, чтобы понять это, но для нет, это работает g, и это фантастика :) – Barks

+0

lol ... возможно, я говорил слишком рано. Я изменил строку @ "moonlightSonataFirstMovement" для selected.materialsFilename, ожидая, что он сможет загрузить любой файл, который был выбран, но в то время как кажется, что он выбирает правильный урок (чьи материалыFilename property равно @ "). Я все еще получаю moonlightSonataFirstMovement PDF загружается ... Так что запутался ... – Barks

+0

извините, но я не понял вашу точку зрения. Так что теперь вы пытаетесь загрузить другой PDF-файл, но у вас всегда есть загрузка moonlightSonataFirstMovement? –

0

В качестве обходного пути вы можете отключить или удалить контрольную точку «Все исключения». Это может сделать отладку немного сложнее, но это не так плохо, как необходимость повторно запускать приложение.

enter image description here

Это контрольная точка вызывает проблему. Я поставил его так давно, что я забыл его там

+0

в моем случае это работало. – user1489709

3

DiskImageCache: Не удалось разрешить абсолютный путь старого каталога.

Это не настоящая причина, по которой приложение выходит из строя. Это предупреждение можно устранить, назначив представление в Раскадке. Похоже, он уже подключен, но серый. Так что назначьте его снова, и все будет хорошо.

Реальная проблема для меня заключалась в том, что изображения в формате PDF составляли 300 DPI, и для загрузки приложения потребовалось слишком много времени. Поскольку отладчик держит приложение от сбоя, кажется, что он работает нормально, но загрузка займет слишком много времени без отладчика и приведет к сбою тайм-аута.

Есть несколько вещей, которые вы можете сделать. Вы можете уменьшить ваш PDF-файл, который может быть хорошим, так или иначе, поскольку более раннее устройство еще медленнее, и хорошо также поддержать их. Но что действительно исправляет это, задерживая инициализацию PageView. Вот что я сделал:

В RootViewController я переместил код из viewDidLoad в новую функцию setupPageViewer.

И поставить это в viewDidLoad:

[самоуправления performSelector: @selector (setupPageViewer) withObject: ноль afterDelay: 0.0f];

Задержка 0.0 означает, что в следующем кадре будет учтено, что даст вам возможность показать индикатор загрузки.

Наслаждайтесь!

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