UIImageView 是 NIL

UIImageView is NIL

我在 viewItem 中有一个默认图像以确保它正常工作,它显示在拆分视图的详细视图中。

@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 每次都出现 nil。

fatal error: unexpectedly found nil while unwrapping an Optional value

但显示默认图像。我已经将其移出 dispatch 甚至尝试直接从 viewDidLoad() 设置它总是出错。它曾经是一个 UIWebView 并且工作完美,除了它不会缓存任何东西。由于加载这些图像需要大量工作,我认为缓存会很好,我已经在 MASTER 视图中对缩略图进行了缓存。

我真傻。我已经为此工作了几天,我想到了尝试更改名称的好主意,并且成功了。我试着把它改回来但它坏了,显然你不能将 ImageView 用作变量!

除了 readibility/maintainability 之外,更改变量名应该没有任何区别,除非存在命名空间冲突(很容易理解 why/where 可能发生的情况)。我还想知道 - 你让 IBOutlet 变弱了。当对象的最后一个强引用消失时,runtime/garbage 收集器自动将对象的弱引用设置为 nil。 (如果您对此不太了解,请查看 Swift 文档的该部分)。

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

这可能是因为你的 viewcontroller。

let vc = MyViewController()

这样的事情是行不通的。您正在创建 VC 而实际上没有让故事板有机会 link IBOutlets。而是使用

storyboard.instantiateViewControllerWithIdentifier(identifier: String)

您可能需要使用

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

希望这对您有所帮助:)

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

我注册后就成功了

我使用的情况不同

awakeFromNib()

而不是

viewDidLoad()

.