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()
.
我在 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()
.