UIImage显示为零

时间:2015-12-17 00:30:19

标签: ios swift uiimage

我的项目有问题。我是编码的新手。我不断收到错误致命错误:在展开Optional值时意外地发现了nil (LLDB)。似乎变量“图像”不产生图像而是产生“零”。变量“photo”正在生成一个与我的JPG图像名称对应的名称。对于一些变量“图像”不能产生UIImage,而是产生零。希望你能帮助我。

import UIKit

class Photo {

    class func allPhotos() -> [Photo] {
        var photos = [Photo]()
        if let URL = NSBundle.mainBundle().URLForResource("Photos", withExtension: "plist") {
            if let photosFromPlist = NSArray(contentsOfURL: URL) {
                for dictionary in photosFromPlist {
                    let photo = Photo(dictionary: dictionary as! NSDictionary)
                    photos.append(photo)
                }
            }
        }

        return photos
    }

    var caption: String
    var comment: String
    var image: UIImage

    init(caption: String, comment: String, image: UIImage) {
        self.caption = caption
        self.comment = comment
        self.image = image
    }

    convenience init(dictionary: NSDictionary)  {
        let caption = dictionary["Caption"] as? String
        let comment = dictionary["Comment"] as? String
        let photo = dictionary["Photo"] as? String
        let image = UIImage(named: photo!)?.decompressedImage
        self.init(caption: caption!, comment: comment!, image: image!)
    }

    func heightForComment(font: UIFont, width: CGFloat) -> CGFloat {
        let rect = NSString(string: comment).boundingRectWithSize(CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
        return ceil(rect.height)
    }
}

我觉得它与图像的解压缩有关:

导入UIKit

扩展UIImage {

var decompressedImage: UIImage {
    UIGraphicsBeginImageContextWithOptions(size, true, 0)
    drawAtPoint(CGPointZero)
    let decompressedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return decompressedImage
}

}

2 个答案:

答案 0 :(得分:1)

最有可能的是这两行:

let image = UIImage(named: photo!)?.decompressedImage
self.init(caption: caption!, comment: comment!, image: image!)

第一行为image分配值,但特别允许零值。这就是?暗示的内容。此外,在decompressedImage(其目的是......不清楚)中,对UIGraphicsGetImageFromCurrentImageContext的调用允许返回nil。

然后在第二行中使用image!而不检查它是否为零。根据您的崩溃, 为零,这意味着以下其中一项是真的:

  • photo实际上并未在您的应用包中包含图片名称,或
  • photo有一个有效的名称,但该文件在某种程度上已损坏到UIImage无法处理的程度,或者
  • decompressedImage返回nil,因为UIGraphicsGetImageFromCurrentImageContext由于某种原因。

答案 1 :(得分:0)

这里有很多事情可能在运行时出错。所以我会专注于一个,并建议你小心力量展开(optionalProperty!),除非你知道你的选项以及在哪些情况下使用力展开是可以的。如果您还不了解后者,则应避免使用!

让我们看看这段代码

let image = UIImage(named: photo!)?.decompressedImage

正如您所提到的,photo是一个可选字符串,可能是nil 。但是,如果我们查看class reference or UIImage,特别是初始化UIImage(named: ...),则会指定

init?(named name: String)

即,参数named应该是一个字符串。 nil不是字符串,因此是您的错误。

如果我们继续假设photo实际上强行打开一个字符串(路径),我们就会遇到下一个问题; " UIImage类型的值没有成员' decompressedImage'" 。回顾class reference for UIImage,我们无法在此处找到此方法。

无论如何,我建议在swift(if letguard let,错误处理)中阅读选项和可选链接,例如

在您的特定情况下,您至少需要处理表达式dictionary["Photo"] as? String返回nil的情况。