设置 UIImageView 的图像
Set Image of UIImageView
我目前有一个包含事件列表的 UITableView。每个事件都有一个按钮,用户可以按下该按钮以访问与事件关联的照片的更大视图。我连接并设置了 UIButton,但我很难在新 window 中设置图像。这是我的功能:
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 = 图片处崩溃并给我 "fatal error: unexpectedly found nil while unwrapping an Optional value"。我已经检查过,图像的路径是正确的,它正在访问图像,但无法将其设置为 UIImageView。我在 class 的顶部设置了 UIImageView 插座。为什么会这样?我以前用这种方式设置过 UIImageView,但现在不行了。
基本上问题是您使用的是感叹号。感叹号永远不安全!它们可以是 "bad smell",一个危险信号 - 在您的代码中,它们就是这样。
(1)
I have the UIImageView outlet set at the top of the class.
但是您没有显示它是如何设置的。您没有显示 largeMapView
是什么或它是如何声明的。声明可能如下所示:
@IBOutlet var largeMapView : UIImageView!
如果是这样,那就不好了——这是一个隐式展开的可选值,这意味着它可能为零。这可能是您问题的根源。通过使用有条件解包的可选项,您可以掩盖问题 - 直到您尝试设置为 nil,然后崩溃。如果它从未被正确设置,这就是崩溃的原因。
(2)
同样,你的代码的其余部分也不应该强制解包选项(使用 !
后缀运算符),除非你知道 某些 他们永远不可能为零。像这样重写,以便每个 Optional 都有条件和安全地展开:
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
是一个 nil 隐式展开的 Optional.
,即使这样也救不了你
我目前有一个包含事件列表的 UITableView。每个事件都有一个按钮,用户可以按下该按钮以访问与事件关联的照片的更大视图。我连接并设置了 UIButton,但我很难在新 window 中设置图像。这是我的功能:
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 = 图片处崩溃并给我 "fatal error: unexpectedly found nil while unwrapping an Optional value"。我已经检查过,图像的路径是正确的,它正在访问图像,但无法将其设置为 UIImageView。我在 class 的顶部设置了 UIImageView 插座。为什么会这样?我以前用这种方式设置过 UIImageView,但现在不行了。
基本上问题是您使用的是感叹号。感叹号永远不安全!它们可以是 "bad smell",一个危险信号 - 在您的代码中,它们就是这样。
(1)
I have the UIImageView outlet set at the top of the class.
但是您没有显示它是如何设置的。您没有显示 largeMapView
是什么或它是如何声明的。声明可能如下所示:
@IBOutlet var largeMapView : UIImageView!
如果是这样,那就不好了——这是一个隐式展开的可选值,这意味着它可能为零。这可能是您问题的根源。通过使用有条件解包的可选项,您可以掩盖问题 - 直到您尝试设置为 nil,然后崩溃。如果它从未被正确设置,这就是崩溃的原因。
(2)
同样,你的代码的其余部分也不应该强制解包选项(使用 !
后缀运算符),除非你知道 某些 他们永远不可能为零。像这样重写,以便每个 Optional 都有条件和安全地展开:
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
是一个 nil 隐式展开的 Optional.