【问题标题】:Swift 2 load image from url variable errorSwift 2 从 url 变量错误加载图像
【发布时间】:2015-10-02 12:57:01
【问题描述】:

我有 load_image 功能并且可以使用

load_image("http://blabla.com/bla.png")

但是当我像这样添加变量时

 load_image(detailDesc2!)

给出这个错误

fatal error: unexpectedly found nil while unwrapping an Optional value

我的代码在这里

ViewController 表查看选定的代码。这里将 detailDesc1 和 detailDesc 2 发送到 DetailView 控制器

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let subcatVC = self.storyboard?.instantiateViewControllerWithIdentifier("Detail") as! DetailViewController
        subcatVC.detailDesc1 = self.arrayCategory[indexPath.row][API_PARAM_CAT_ID] as! String
        subcatVC.detailDesc2 = self.arrayCategory[indexPath.row][API_PARAM_CAT_IMAGE] as! String
        _ = UINavigationController(rootViewController: subcatVC)
        self.navigationController?.pushViewController(subcatVC, animated: false)
    }

DetailViewController

   var detailDesc1:String?
    var detailDesc2:String?

    load_image(detailDesc2!)  // HERE GIVES ERROR

我的 load_image 函数

func load_image(urlString:String)
{
    let imgURL: NSURL = NSURL(string: urlString)!
    let request: NSURLRequest = NSURLRequest(URL: imgURL)

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in

        if (error == nil && data != nil)
        {
            func display_image()
            {
                self.imagetbig.image = UIImage(data: data!)
            }

            dispatch_async(dispatch_get_main_queue(), display_image)
        }

    }

    task.resume()
}

此外,当我添加此代码时,成功工作标签和 textviews 显示。

textbig.text = detailDesc1
textim.text = detailDesc2

【问题讨论】:

  • 您的 urlString 为零。在传递之前检查 detailDesc2-value。
  • 什么时候调用“load_image(detailDesc2!)”?
  • 已解决,谢谢!所有维克多都给出了代码;)

标签: ios swift swift2 nsurl loadimage


【解决方案1】:

由于某种原因,您的变量detailDesc2nil,并且您使用! 来强制解包,告诉编译器当变量被声明为可选时该变量始终具有一个值(它可能是非值)。根据Apple

尝试使用!访问不存在的可选值会触发运行时错误。在使用之前,请务必确保可选项包含非零值!强制解包它的值。

你可以使用optional binding避免运行时错误,在使用变量之前检查如下:

if let url = detailDesc2 {
    load_image(url)
}

正如@LeoDabus 现在在 Swift 2 中推荐的那样,您也可以使用 guard 语句,您可以通过以下方式使用:

guard if let url = detailDesc2 else {
   return 
}

load_image(url)

根据Apple

guard 语句与 if 语句一样,根据表达式的布尔值执行语句。您使用保护语句来要求条件必须为真才能执行保护语句之后的代码。与 if 语句不同,guard 语句总是有一个 else 子句——如果条件不成立,则执行 else 子句中的代码。

希望对你有所帮助。

【讨论】:

  • @SwiftDeveloper 不客气,如果它解决了你的问题,请接受答案。
  • @Victor Swift 2.0 guard let data = data where error == nil else { return }
  • @LeoDabus 是的,你是对的,guard 是一种语法糖,它也可以使用。
【解决方案2】:

我希望 self.arrayCategory[indexPath.row][API_PARAM_CAT_IMAGE] 返回 nil

您可以在使用前检查变量:

if let imageUrl = detailDesc2 {
    load_image(imageUrl)
}

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 2014-08-05
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多