2015-01-09 116 views
0

我目前有一個UITableView,它包含一系列事件。每個事件都有一個按鈕,用戶可以按下該按鈕訪問與事件相關的照片的更大視圖。我有UIButton連接和設置,但我很難在新窗口中設置圖像。這裏是我的功能:UIImageView的設置圖像

func largeMap(sender: UIButton!) { 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
    let manager = NSFileManager.defaultManager() 
    self.performSegueWithIdentifier("largeMapView", sender: self) 
    println(sender.tag.description) 
    println(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png") 
    if let image = UIImage(data: manager.contentsAtPath(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png")!) { 
     largeMapView.image = image 
    } 
} 

當我運行的應用程序,它崩潰的largeMapView.image =圖像,並給了我「致命錯誤:意外發現零而展開的可選值」。我已經檢查過,圖像的路徑是正確的,它正在訪問圖像,但它無法將其設置爲UIImageView。我有UIImageView出口設置在類的頂部。這是爲什麼發生?我以前用這種方式設置了UIImageView,但它現在不起作用。

回答

1

基本上問題是你正在使用驚歎號。感嘆號永遠不會安全!它們可能是一種「難聞的氣味」,一種危險信號 - 並且在您的代碼中,這正是它們的樣子。

(1)

I have the UIImageView outlet set at the top of the class.

但是你不顯示如何設置。你不顯示什麼largeMapView是或如何聲明。聲明可能是這樣的:

@IBOutlet var largeMapView : UIImageView! 

如果是這樣,這是不好的 - 這是一個隱含展開可選的,這意味着它可能是零。這可能是你問題的根源。通過使用有條件的解包可選,你正在掩蓋這個問題 - 直到你嘗試設置爲零,然後你崩潰。如果它永遠不能正確設置,那就是崩潰的原因。

(2)

沿着相同的同一行,你的代碼的其餘部分,也不宜強行拆開包裝選配(使用!後綴運算符),除非你知道某些他們永遠是零。重寫這樣讓每一個可選有條件,安全地解開:

if let d = manager.contentsAtPath(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png") { 
    if let image = UIImage(data: d) { 
     largeMapView.image = image 
    } 
} 

這樣,如果contentsAtPath失敗或UIImage(data:)失敗,什麼都不會發生 - 你不會設置你的形象 - 但至少你不會崩潰。你可以在調試器中使用步進來找出你的失敗。 - 但即使這不會爲你節省,如果問題是largeMapView是一個零隱式解包可選。

+0

我按照您的建議實施安全解包。在運行應用程序時,它安全地解開圖像,但仍然到達最後並在'largeMapView.image = image'上崩潰,並且說它意外地發現零,同時展開可選項,這導致我質疑我製作的插座。 – user3185748 2015-01-10 00:09:00

+0

正確。這就是爲什麼_I_質疑出路。我相信你的崩潰純粹是診斷性的;你的_real_問題是你的出口沒有被設置。但那將是一個不同的問題!我相信我已經回答了你實際提出的問題,也就是爲什麼你首先會崩潰。 – matt 2015-01-10 00:18:03

+0

我很感激幫助,但我必須繼續努力才能解決問題。如果你有任何想法,如果很高興聽到他們! – user3185748 2015-01-10 00:22:02

相關問題