UIImageView是NIL

时间:2015-02-04 21:38:45

标签: swift uiimageview dispatch-async

我在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
        })
    }
}

ImageView每次都是零。

fatal error: unexpectedly found nil while unwrapping an Optional value

但默认图片显示。我已经将其从调度中移出,甚至尝试从viewDidLoad()始终设置错误。它曾经是一个UIWebView并且完美地工作,除了它不会缓存任何东西。由于加载这些图像是很多工作,我认为缓存会很好,我已经在MASTER视图中为缩略图工作了缓存。

5 个答案:

答案 0 :(得分:4)

这可能是因为你的视图控制器是如何实现的。

let vc = MyViewController()

这样的事情不会奏效。您正在创建VC而不实际为故事板提供链接IBOutlet的机会。而是使用

storyboard.instantiateViewControllerWithIdentifier(identifier: String)

您可能需要使用

参考故事板
let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle())

希望这会有所帮助:)

答案 1 :(得分:0)

傻傻的我。我已经为此工作了几天,我有个好主意尝试更改名称,并且它有效。我尝试将其更改回来并且它已损坏,显然您无法将ImageView用作变量!

答案 2 :(得分:0)

除了可读性/可维护性之外,更改变量名称应该没有任何区别,除非存在命名空间冲突(很好地理解为什么/可能发生的位置)。我也想知道 - 你让IBOutlet变得虚弱无力。当对象的最后剩余强引用消失时,运行符/垃圾收集器自动将对对象的弱引用设置为nil。 (查看Swift文档的那一部分,如果你不是很扎实的话)。

也许你应该通过添加deinit {println(,“ function name deallocated'}来检查你的类和控制器。在使用改变变量名称时看到的弱行为和改进行为之间,似乎就像你的应用程序本身可能会发生一些奇怪的(错误的)交互。

答案 3 :(得分:0)

我的情况是因为我使用的是nib而没有注册。

一旦我注册了它,它就会起作用

答案 4 :(得分:0)

我用过的情况不同

<块引用>

awakeFromNib()

代替

<块引用>

viewDidLoad()

.