Фатальная ошибка: неожиданно найден nil при развертывании необязательного значения - Swift с NSURLRequest

Я пытаюсь сделать простое приложение веб-браузера в Swift, чтобы изучить язык. Прямо сейчас, я застрял на том, чтобы разрешить пользователю использовать недавно добавленную закладку и загрузить веб-просмотр определенного URL-адреса.

Чтобы решить, какой URL выбрать, у меня это есть в моем BookmarkTVC (TableViewController с закладками)

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
 let vc = ViewController(nibName: "ViewController", bundle: nil)
 vc.gotoWebsite(bookmarks[indexPath.row].url)
 self.dismissViewControllerAnimated(true, completion: nil)
}

EDIT: Скриншот BookmarksTVC: http://imgur.com/7rKcGBZ

Я знаю 100%, что

закладки [indexPath.row].url

получает правильную строку, потому что я ее распечатал.

Теперь это моя функция vc.gotoWebsite

func gotoWebsite(link: String) {
 // Format Link
 var formattedLink: String!

 if link.hasPrefix("http://") || link.hasPrefix("https://") {
 formattedLink = link
 } else if link.hasPrefix("www.") {
 formattedLink = "http://\(link)"
 } else {
 formattedLink = "http://www.\(link)"
 }

 // Goto formatted link
 println(formattedLink)
 let url = NSURL(string: formattedLink)
 println(url)
 let request = NSURLRequest(URL: url)
 println(request)
 webView.loadRequest(request)
}

В webView.loadRequest(request) я получаю:

fatal error: unexpectedly found nil while unwrapping an Optional value

это точка останова (изображение): http://imgur.com/S7dMswD&4pdL4xX

даже если я напечатал переменную request и получил ответ

<nsurlrequest: 0x7fb9c8616700=""> { URL: https://www.google.com/?gws_rd=ssl, headers: (null) }</nsurlrequest:>

Пожалуйста помоги. Опять же, все, что я пытаюсь сделать, это получить URL-адрес, который связан с ячейкой таблицы, которую пользователь нажал. Затем я использую эту строку и вызываю метод из другого класса, который идет на этот URL.

1 ответ

Я столкнулся с этой проблемой. Я преодолел это, добавив параметр request в мой UIViewController vc который отображает UIWebView:

var request: NSURLRequest? {
 didSet {
 if request != nil { // didSet is called even if you are setting request to nil :-(
 webView?.loadRequest(request!) // do not load request if webView is nil
 }
 }
}

а затем в том же viewController:

override func viewDidLoad() {
 super.viewDidLoad()
 // ...
 if request != nil {
 webView.loadRequest(request!)
 }
}

поэтому я могу писать в вызывающем коде, который создает экземпляр vc, а не webView.loadRequest(),

vc.request = NSURLRequest(URL: NSURL(string: urlAsString)!)

и это приведет либо к запуску webView для загрузки через функцию didSet если WebView был определен к тому времени, либо, если это не так, приведет к тому, что webView будет загружаться в viewDidLoad позже. Я не знаю, прекрасно ли это, но это работает для меня.

licensed under cc by-sa 3.0 with attribution.