【问题标题】:Swift: Trying to implement NSCodingSwift:尝试实现 NSCoding
【发布时间】:2015-11-21 19:20:53
【问题描述】:

我正在尝试将 NSCoding 协议添加到我的自定义类中:

class Convo: NSObject, NSCoding {
    var name: String
    var pic: UIImage

    override init() {
        self.name = "Dror"
        self.pic = UIImage (named: "NoPic.png")!
        super.init()
    }

    required init(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObjectForKey("name") as! String
        self.pic = aDecoder.decodeObjectForKey("pic") as! UIImage
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.name, forKey: "name")
        aCoder.encodeObject(self.pic, forKey: "pic")
    }

}

但它在该行弹出一个错误:

self.pic = aDecoder.decodeObjectForKey("pic") as! UIImage

控制台中的错误是:

致命错误:在展开可选值时意外发现 nil

而xcode中的错误是:

线程 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)

我不知道该怎么办。

编辑: 运行此代码时:

class Convo: NSObject, NSCoding {
    var name: String
    var pic: UIImage!

    override init() {
        self.name = "Dror"
        self.pic = UIImage (named: "NoPic.png")!
        super.init()
    }

    required init(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObjectForKey("name") as! String
        self.pic = aDecoder.decodeObjectForKey("pic") as? UIImage
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.name, forKey: "name")
        aCoder.encodeObject(self.pic, forKey: "pic")
    }
}

编译没问题,但是self.pic最后是nil而不是UIImage(命名为:“NoPic.png”)

【问题讨论】:

  • 你的代码非常令人兴奋,到处都是感叹号!

标签: swift uiimage nscoding


【解决方案1】:

您确定您的资产中有所需的图片吗? "NoPic.png"

好的,这里有一些变化:

class Convo: NSObject, NSCoding {
    var name: String
    var pic: UIImage?

    override init() {
        self.name = "Dror"
        self.pic = UIImage (named: "NoPic")
        super.init()
    }

它对我有用,但您必须确保该图像存在于您的资产中。可以跳过.png格式

【讨论】:

  • 现在它说“可选类型'UIImage的值?'没有打开;你是不是要使用“!”还是‘?’?”
  • 是的,我确实将它添加到我的资产中
  • 现在看。添加 ”?”存储财产并删除“!”和 UIImage 中的“.png”。
【解决方案2】:

这行得通:

class Convo: NSObject, NSCoding {
    var name: String
    var pic: UIImage?

    override init() {
        self.name = "Dror"
        self.pic = UIImage (named: "NoPic.png")
        super.init()
    }

    required init(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObjectForKey("name") as! String
        self.pic = aDecoder.decodeObjectForKey("pic") as? UIImage
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.name, forKey: "name")
        aCoder.encodeObject(self.pic, forKey: "pic")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多