2015-01-09 119 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

相关问题