如何使用URL显示图像?

Mac*_*ndo 32 url ios swift

错误是:"致命错误:在解包可选值时意外发现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,如下图所示 在此输入图像描述


Gou*_*shi 6

在这里,我有一种方法,在下载图像时,您不会遇到任何类型的崩溃.现在您正在使用以下代码:

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)

而且我相信如果您使用它,您的零崩溃将会得到解决.


Sul*_*ija 3

尝试写:

if data != nil {}
Run Code Online (Sandbox Code Playgroud)

反而:

if data!= nil {}
Run Code Online (Sandbox Code Playgroud)

编译器可能会将感叹号与解包可选值的操作混淆。