В то время как загрузка PDF в WebView я получаю Не удалось привести значение типа «__NSCFString» (0x1032a04f0) к «NSURL» (0x1032a21b0). ошибка - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь загрузить pdf в webView, но ссылка api пришла от api, и я хочу открыть эту ссылку в webView, которая на самом деле находится на другом viewController, поэтому я передаю ссылку на это представление и загружаю в webView но я получаю ошибку вот так:

Не удалось привести значение типа '__NSCFString' (0x1032a04f0) к 'NSURL' (0x1032a21b0).

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let view: PDFViewController = self.storyboard?.instantiateViewController(withIdentifier: "PDFViewController") as! PDFViewController

    let pdf = eCataLogList[indexPath.row]["pdf_file"]
    let request = NSURLRequest(url: (pdf as? URL)!)
   // let request = NSURLRequest(url: pdf as! URL);
    view.pdf_web.loadRequest(request as URLRequest)
    self.navigationController?.pushViewController(view, animated: true)
} 

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Хорошо, что вы проверяете ошибку в отладчике (дебютанты делают это не часто).

Не удалось привести значение типа '__NSCFString' (0x1032a04f0) к 'NSURL' (0x1032a21b0).

Давайте переведем это:

В какой-то момент в вашем коде вы пытаетесь преобразовать объект NSString (это часть __NSCFString) в NSURL. Это означает, что вы пытаетесь сообщить компилятору, что эта строка может быть NSURL, и она говорит вам НЕТ во время выполнения.

Вот строка: (pdf as? URL)!

Спросите вас об этом: Может ли объект String быть переведен как объект URL? Можно ли UIImage перевести как CBPeripheral? Нет, не совсем.? Классы / структуры имеют значение, различную цель и различное использование.

Быстрое исправление:

let pdfURLString = eCataLogList[indexPath.row]["pdf_file"] //So that's a String
let pdfURL = URL.init(string: pdfURLString)
let request = NSURLRequest(url: pdfURL!)

Теперь давайте рассмотрим еще ваш код:

Избегайте использования NSStuff, когда есть версия "Swift": NS(Mutable)URLRequest => URLRequest и т. Д. Конечно, вы можете использовать мосты и привести как URLRequest в NSURLRequest и наоборот , но обратите внимание, что в вашем текущем коде вы делаете NSURLRequest до URLRequest, в то время как вы могли бы использовать URLRequest с самого начала. Это просто добавляет шумы, чтобы делать каждый раз as.

Избегайте принудительного разворачивания, когда это возможно, это использование !. Если это не удается (это ноль), он потерпит крах. Вместо этого используйте guard let или if let

guard let view: PDFViewController = self.storyboard?.instantiateViewController(withIdentifier: "PDFViewController") as? PDFViewController else {
    print ("Error in initializing the PDFViewController")
    return
}

let pdfURLString = eCataLogList[indexPath.row]["pdf_file"]
if let pdfURL = URL.init(string: pdf) {
    let request = URLRequest(url: pdfURL)
    view.pdf_web.loadRequest(request)
    self.navigationController?.pushViewController(view, animated: true)
} else {
    print("Ooops, \(pdfURLString ?? "pdfURLString for row \(indexPath.row)") doesn't seem to be a valid URL")
}

Примечание:
Я явно написал URL.init(string: someURLString), но вы можете написать URL(string: someURLString).

0 голосов
/ 05 июля 2018

Вы должны сначала преобразовать вашу PDF-строку в URL. Используйте следующий код,

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let view: PDFViewController = self.storyboard?.instantiateViewController(withIdentifier: "PDFViewController") as! PDFViewController
    let pdf = eCataLogList[indexPath.row]["pdf_file"]
    let request = URLRequest(url: URL(string: pdf))
    view.pdf_web.loadRequest(request)
    self.navigationController?.pushViewController(view, animated: true)
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...