UIImageView是NIL

Jas*_*n G 3 uiimageview dispatch-async swift

我在viewItem中有一个默认图像,以确保它正常工作,该图像显示在splitview的详细信息视图上。

@IBOutlet weak var ImageView: UIImageView!

var imageCache = [String: UIImage]()

override func viewDidLoad() {
    super.viewDidLoad()
    self.configureView()
}

func configureView() {
    if let detail: AnyObject = self.detailItem {
        if let label = self.detailDescriptionLabel {
            let dict = detail as [String: String]
            label.text = ""
            let s = dict["result"]
            let vr = NString(string: s!)
            let vrd = vr.doubleValue
            let value = ceil(vrd*20)
            let valueString = String(format: "%.0f", value)

            vresult.text = "\(valueString)%"

            getPic(dict)  // <---- trouble maker

            fitem.hidden = false
            ritem.hidden = false
        }
    } else {
        navigationController?.popViewControllerAnimated(true)
    }
}

func getPic(item: [String: String]) {
    var chachedImage = self.imageCache[item["image"]!]

    println(item["image"]) // <-- prints out the url

    if cachedImage == nil {
        var imgUrl = NSURL(string: item["image"]!)
        let request: NSURLRequest = NSURLRequest(URL: imgUrl!)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {( reponse: NSURLResponse!, data: NSData!, error; NSError!) -> Void in
            if error == nil {
                cachedImage = UIImage(data: data)

                println("got here no problem") // <-- prints out

                self.imageCache[item["image"]!] = cachedImage

                println(self.imageCache) // <-- prints reference OK

                dispatch_async(dispatch_get_main_queue(), {
                    self.ImageView.image = cachedImage  // <---- offender
                })
            } else {
               println("Error: \(error.localizedDescription)")
            }
        })
    } else {
        dispatch_async(dispatch_get_main_queue(), {
            self.ImageView.image = cachedImage
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

每次ImageView都为零。

fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

但显示默认图像。我已经将其移出了调度程序,甚至尝试直接从viewDidLoad()始终将其设置为错误。它曾经是一个UIWebView,并且除了不会缓存任何内容外,它的运行情况非常好。由于加载这些图像需要大量工作,因此我认为缓存会很不错,因此可以在MASTER视图中缓存缩略图。

小智 5

这可能是由于您的视图控制器的稳定性如何。

let vc = MyViewController()
Run Code Online (Sandbox Code Playgroud)

这样的事情是行不通的。创建VC时,实际上并没有为情节提要板提供链接IBOutlets的机会。改为使用

storyboard.instantiateViewControllerWithIdentifier(identifier: String)
Run Code Online (Sandbox Code Playgroud)

您可能需要使用以下内容获得故事板的参考

let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle())
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)