ios - NSKeyedArchiver: key 返回 nil - Swift

标签 ios swift null nskeyedarchiver

我这里遇到一些问题。我正在尝试使用 NSKeyedArchiver 存储一些信息,但是当我运行该应用程序时,我得到: fatal error :在展开可选值时意外发现 nil

Apple docs says: "If you invoke one of the decode... methods of this class using a key that does not exist in the archive, a non-positive value is returned. This value varies by decoded type. For example, if a key does not exist in an archive, decodeBoolForKey: returns NO, decodeIntForKey: returns 0, and decodeObjectForKey: returns nil."

正如文档所说,我用于解码对象的 key 返回 nil,但我不知道为什么。

这是我的代码:

import UIKit
import CoreData

class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, sendDetailsToMVCDelegate, NSFetchedResultsControllerDelegate, NSCoding {

    @IBOutlet weak var tableView: UITableView!
    var namesListArray:[String] = []
    var imagesListArray:[UIImage] = []

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.namesListArray = aDecoder.decodeObjectForKey("namesListArray") as! [String] **//HERE IS THE CRASH LINE**
        self.imagesListArray = aDecoder.decodeObjectForKey("imagesListArray") as! [UIImage]
    }

    override func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.namesListArray, forKey: "namesListArray")
        aCoder.encodeObject(self.imagesListArray, forKey: "imagesListArray")
    }

    override func viewDidLoad() {
        let dir = getUserDir()
        let archive = "\(dir)/iRecipeList-namesListArray"
        if let loaded: AnyObject = NSKeyedUnarchiver.unarchiveObjectWithFile(archive) {
            self.namesListArray = (loaded as? Array)!
        }
    }

    override func viewDidAppear(animated: Bool) {
    }

    func sendDetailsToMVC (name: String, image: UIImage) {

        namesListArray.append(name)
        let dir = getUserDir()
        let archive = "\(dir)/iRecipeList-namesListArray"
        NSKeyedArchiver.archiveRootObject(namesListArray, toFile: archive)

        imagesListArray.append(image)
        tableView.reloadData()
    }

    func getUserDir() -> String {
        let userDir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        return userDir[0] as! String
    }


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return namesListArray.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let row = indexPath.row
        let name = namesListArray[row]
        println("\(row)/")
        let image = imagesListArray[row]
        var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
        cell.textLabel?.text = name
        cell.imageView!.image = image

        return cell
}

    func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return true
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
         func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject) {
            if segue.identifier == "goToInfoVC" {
                if let navigation = navigationController {
                    navigation.popViewControllerAnimated(true)
                }
            }
        }
    }
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "newReciep" {
            var vc = segue.destinationViewController as! DetailsViewController
            vc.delegateDetails = self
        }
    }
}

有人有什么想法吗?提前致谢!

Error pic

编辑 1 enter image description here

最佳答案

将 init 更改为:

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    if let namesList = aDecoder.decodeObjectForKey("namesListArray") as? [String] {
        namesListArray = namesList
    } else {
        namesListArray = [String]
    }
    ...
}

关于ios - NSKeyedArchiver: key 返回 nil - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30686564/

相关文章:

c - 为什么我看不到数组中的最后一个字符是空终止符?

iOS:当 View 背景颜色为清晰颜色时,图层背景颜色不显示

iphone - UITableView 重新加载完成后是否有可能获得回调?

ios - 每50分后加速游戏

ios - 在另一个 View Controller 上访问和修改 UIImage 项

"WHERE"子句中的 Oracle 和可能的常量谓词

ios - "too many HTTP redirects"使用 Alamofire 上传多部分表单数据

swift - 将数据从 UIViewController 发送到 UIView

swift - Swift 中的 Curried 闭包

regex - 使用 REGEX 在 Hive Create 和 Load Query 中获取空值