2015-10-02 53 views
1

我有load_image功能,並與斯威夫特2負荷圖像

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 
+0

您的urlString爲零。在傳遞之前檢查detailDesc2值。 – Christian

+0

你什麼時候調用「load_image(detailDesc2!)」? –

+0

解決了傢伙謝謝!所有的維克托給代碼;) – SwiftDeveloper

回答

1

出於某種原因,你的變量detailDesc2nil,你強制使用!解纏告訴編譯當變量被聲明爲可選時(可能是非值),變量總是有一個值。根據Apple

試圖使用!訪問不存在的可選值會觸發運行時錯誤。在使用之前,務必確保可選項包含非零值!強迫 - 解開其價值。

你能避免使用optional binding運行時錯誤,檢查前通過以下方式使用變量,如:

if let url = detailDesc2 { 
    load_image(url) 
} 

由於@LeoDabus現在建議在斯威夫特2,你可以使用太guard聲明

guard if let url = detailDesc2 else { 
    return 
} 

load_image(url) 

根據Apple

您可以通過以下方式使用像

guard語句與if語句一樣,根據表達式的布爾值執行語句。您使用guard語句來要求條件必須爲真,以便執行guard語句後的代碼。與if語句不同,guard語句總是有一個else子句 - 如果條件不成立,則執行else子句中的代碼。

我希望這對你有所幫助。

+0

偉大!謝謝你的工作:) – SwiftDeveloper

+0

@SwiftDeveloper不客氣,請接受答案,如果它解決你的問題。 –

+0

@Victor Swift 2.0後衛讓數據=數據其中錯誤==零其他{返回} –

0

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

可以使用之前檢查變量:

if let imageUrl = detailDesc2 { 
    load_image(imageUrl) 
}