错误是:"致命错误:在解包可选值时意外发现nil"
我在ViewController中执行以下操作:
var imageURL:UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string:"http://cdn.businessoffashion.com/site/uploads/2014/09/Karl-Lagerfeld-Self-Portrait-Courtesy.jpg")
let data = NSData(contentsOfURL:url!)
if data!= nil {
imageURL.image = UIImage(data:data!)
}
}
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么它会报告错误
imageURL.image = UIImage(data:data!)
Run Code Online (Sandbox Code Playgroud)
虽然数据为零,但我已经告诉它不要继续.这不是链接的问题."数据"也没有问题.我试着打印它,它不是零.
Air*_*ity 57
错误很可能imageURL
是零.您是在代码中的其他位置为其分配值,还是实际@IBOutlet
在实际代码中?如果你没有为它赋值,它将是nil - 但它的类型UIImageView!
意味着它是一个"隐式解包的可选",这意味着编译器不会阻止你使用它,即使它是nil,但会在运行时崩溃你得到的错误.
其余的代码是正确的(假设之前缺少的空格!=
是编译代码中的拼写错误),但最好还是使用if let
解包你的选项而不是检查它们nil
然后使用force-unwrap运算符:
if let url = NSURL(string: "http://etc...") {
if let data = NSData(contentsOfURL: url) {
imageURL.image = UIImage(data: data)
}
}
Run Code Online (Sandbox Code Playgroud)
如果您碰巧使用Swift 1.2测试版,可以将两个ifs组合在一起:
if let url = NSURL(string: "http://etc..."),
data = NSData(contentsOfURL: url)
{
imageURL.image = UIImage(data: data)
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意,请使用flatMap
:
imageURL.image =
NSURL(string: "http://etc...")
.flatMap { NSData(contentsOfURL: $0) }
.flatMap { UIImage(data: $0) }
Run Code Online (Sandbox Code Playgroud)
Ani*_*ol. 16
这是我的代码可能会帮助你
斯威夫特2:
extension UIImageView{
func setImageFromURl(stringImageUrl url: String){
if let url = NSURL(string: url) {
if let data = NSData(contentsOfURL: url) {
self.image = UIImage(data: data)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特3:
extension UIImageView{
func setImageFromURl(stringImageUrl url: String){
if let url = NSURL(string: url) {
if let data = NSData(contentsOf: url as URL) {
self.image = UIImage(data: data as Data)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法
let imgURL = "https://yourdomain.com/picturepath/picname.png" // or jpg
self.myImage.setImageFromURl(stringImageUrl: imgURL)
Run Code Online (Sandbox Code Playgroud)
如果您使用HTTP连接而不是https,请不要忘记添加此项
App Transport Security Settings
作为字典并将其 Allow Arbitrary Loads
作为布尔值YES
,如下图所示
在这里,我有一种方法,在下载图像时,您不会遇到任何类型的崩溃.现在您正在使用以下代码:
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string:"http://cdn.businessoffashion.com/site/uploads/2014/09/Karl-Lagerfeld-Self-Portrait-Courtesy.jpg")
let data = NSData(contentsOfURL:url!)
if data!= nil {
imageURL.image = UIImage(data:data!)
}
}
Run Code Online (Sandbox Code Playgroud)
现在用这个改变代码,如果你继续这种方法:
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string:"http://cdn.businessoffashion.com/site/uploads/2014/09/Karl-Lagerfeld-Self-Portrait-Courtesy.jpg")
let data = NSData(contentsOfURL:url!)
// It is the best way to manage nil issue.
if data.length > 0 {
imageURL.image = UIImage(data:data!)
} else {
// In this when data is nil or empty then we can assign a placeholder image
imageURL.image = UIImage(named: "placeholder.png")
}
}
Run Code Online (Sandbox Code Playgroud)
而且我相信如果您使用它,您的零崩溃将会得到解决.
尝试写:
if data != nil {}
Run Code Online (Sandbox Code Playgroud)
反而:
if data!= nil {}
Run Code Online (Sandbox Code Playgroud)
编译器可能会将感叹号与解包可选值的操作混淆。
归档时间: |
|
查看次数: |
87721 次 |
最近记录: |