我有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()
}
此外,当我添加此代码时,成功的工作标签和textview显示。
textbig.text = detailDesc1
textim.text = detailDesc2
答案 0 :(得分:1)
由于某种原因,您的变量detailDesc2
为nil
并且您使用!
强制解包,告诉编译器变量在变量被声明为可选时始终具有值(它可以是非价值的)。根据{{3}}:
尝试使用!访问不存在的可选值会触发运行时错误。在使用之前,请务必确保可选项包含非零值!强行解开它的价值。
您可以使用Apple来避免运行时错误,在使用变量之前进行检查,如下所示:
if let url = detailDesc2 {
load_image(url)
}
正如@LeoDabus现在在Swift 2中推荐的那样,您也可以使用optional binding语句,如下所示:
guard if let url = detailDesc2 else {
return
}
load_image(url)
根据guard
:
与if语句一样,guard语句根据表达式的布尔值执行语句。您使用guard语句要求条件必须为true才能执行guard语句之后的代码。与if语句不同,guard语句总是有一个else子句 - 如果条件不为真,则执行else子句中的代码。
我希望这对你有所帮助。
答案 1 :(得分:0)
我希望self.arrayCategory[indexPath.row][API_PARAM_CAT_IMAGE]
返回nil
您可以在使用前检查变量:
if let imageUrl = detailDesc2 {
load_image(imageUrl)
}