Это ошибка Swift? Открытие файла в WebView

#ios #webview #swift

#iOS #webview #swift

Вопрос:

Я начинаю осваивать этот новый язык, который мне очень нравится… но, похоже, это ошибка большая, чем я ожидал.

Я взял простой пример на youtube (https://www.youtube.com/watch?v=Rva9ylPHi2w ) создания WebView в корневом ViewController и загрузки веб-страницы. Этот пример отлично работает с внешней веб-страницей, но не с локальным файлом. При попытке открыть локальный файл я получаю пустой экран.

Приведенный ниже код предназначен для файла ViewController.swift.

 import UIKit

class ViewController: UIViewController {

    @IBOutlet var WebView : UIWebView

    var URLPath = ""/files/test.html""

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        loadAddressURL()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func loadAddressURL() {
        let requestURL = NSURL (string:URLPath)
        let request = NSURLRequest(URL: requestURL)

        println("the requestURL is: (requestURL)")

        WebView.loadRequest(request)
    }

}
  

Вы можете видеть, что я добавил println, чтобы показать используемый запрос URL, и он отображается в обратном порядке:

С локальным файлом я получаю «запрос: /files/test.html «, где у меня находится образец HTML-файла.

Я что-то сделал неправильно или мне следует отправить это в Apple?

Ответ №1:

Вот как я заархивировал для загрузки html из локального файла

  let bundle = NSBundle.mainBundle()
 var url = bundle.URLForResource("yourHTML", withExtension: "html");
 var request = NSURLRequest(URL: url!);
 webContent.loadRequest(request)
  

Ответ №2:

Вместо создания NSURL с помощью этого конструктора используйте [NSURL fileURLWithPath:] вместо этого.

Комментарии:

1. Да, я пробовал это раньше и получил очень странный путь в println: «requestURL — это: /files/test.html — file:///». Обратите внимание, как «file ///» вставляется после загрузки моей переменной, что, конечно, оставляет mw с пустым экраном, поскольку путь неверен.

2. Да, именно так [NSURL description] он выводится на печать, но на самом деле URL выглядит не так.

3. Итак, он по-прежнему не работает, и все, что я получаю в эмуляторе, — это пустой WebView. Звучит так, будто я запускаю ошибку с Apple

4. Я очень, очень сомневаюсь, что это ошибка Apple. Поместите файл в каталог documents приложения и получите к нему доступ там.

5. Я начал с этого там, и там это тоже не сработало. Я перешел в каталог files в каталоге main apps, куда я в конечном итоге хочу, чтобы он попал.

Ответ №3:

На самом деле вы не можете загрузить «локальный файл». Вместо этого убедитесь, что ваш файл добавлен на Copy Bundle Resources фазу сборки вашего целевого объекта, и запросите его URL по умолчанию NSBundle , например, вот так:

 let url = NSBundle.mainBundle().URLForResource("test", withExtension: "html")
  

Если файл находится в группе проектов (желтый значок), вам не нужно указывать какую-либо информацию о пути к файлу, потому что копируется файл, а не группа проектов.

Если файл находится в ссылке на папку (синий значок папки), вся папка копируется в пакет. В этом случае используйте URLForResource(, withExtension:, subdirectory:) или любой подобный метод вместо этого. (Проверьте документацию или файл заголовка NSBundle )

Комментарии:

1. Если я сделаю это таким образом, как я должен включать какую-либо информацию о пути?

2. @padapa О, извините, я предполагал, что вам не нужно было (см. правки)

3. Вы правы, я не видел изменений. Я попробую.

Ответ №4:

Я новичок, поэтому не доверяйте моему коду

Кажется, что это работает, однако это приводит к задержке моего xCode 6 (необычно.) Я воспользовался руководством, предоставленным AppleDev / Swift Dive (https://www.youtube.com/watch?v=Rva9ylPHi2w ) Если вы разместите свой index.html файл в индексе вашего приложения, это код для использования;

 import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var webview: UIWebView!
    let url = NSBundle.mainBundle().URLForResource("index", withExtension: "html")

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        loadAddressURL()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func loadAddressURL() {
        let request = NSURLRequest(URL: url!)
        webview.loadRequest(request)
    }
}
  

Индекс выглядит примерно так :

 Folder Project/app/
Folder Project/app/AppDelaget.swift
Folder Project/app/ViewController.swift
Folder Project/app/main.storybord
Folder Project/app/index.html
  

Ответ №5:

UIWebView на языке Swift :-

Пожалуйста, обновите свой код и установите URLPath в двойные кавычки вот так

 var URLPath = "/files/test.html"
  

вы также можете использовать этот код для WebView

 self.webView!.loadRequest(NSURLRequest(URL:NSURL(string:"https://www.google.com")))