2015-06-06 2 views
2

У меня здесь проблемы. Я пытаюсь хранить некоторую информацию с помощью NSKeyedArchiver, но когда я запускаю приложение, я получаю: фатальная ошибка: неожиданно найден нуль при развертывании необязательного значения.NSKeyedArchiver: ключ возвращает ноль - Swift

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."

Мой ключ для декодирования объект возвращается ноль, как говорит Docs, но я понятия не имею, почему.

Вот мой код:

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

EDIT 1 enter image description here

+0

Этот 'self.namesListArray = (загруженный как? Array)!' Выглядит неправильно. Вы имели в виду 'self.namesListArray = (загружен как? [String])!'? А что, если актеры не сработали? – dasdom

+0

Я сделал, как вы сказали, и ошибка сохраняется. Сохраняет ноль. –

+0

Обновлены вопросы с ошибкой журнала –

ответ

3

Изменение инициализации этого:

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

Работает как очарование, брат. Имейте вас одного! –

+0

Добро пожаловать! – dasdom

0

Вот полный код с решением:

импорт UIKit импорта CoreData

класс 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) 
    if let namesList = aDecoder.decodeObjectForKey("namesListArray") as? [String] { 
     namesListArray = namesList 
    } else { 
     namesListArray = [String]() 
    } 
    if let imagesList = aDecoder.decodeObjectForKey("imagesListArray") as? [UIImage] { 
     imagesListArray = imagesList 
    } else { 
     imagesListArray = [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 archiveName = "\(dir)/iRecipeList-namesListArray" 
    if let loaded: AnyObject = NSKeyedUnarchiver.unarchiveObjectWithFile(archiveName) { 
     self.namesListArray = (loaded as? [String])! 
    } 
    let archiveImage = "\(dir)/iRecipeList-imagesListArray" 
    if let loaded: AnyObject = NSKeyedUnarchiver.unarchiveObjectWithFile(archiveImage) { 
     self.imagesListArray = (loaded as? [UIImage])! 
    } 

} 

override func viewDidAppear(animated: Bool) { 
} 

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

    namesListArray.append(name) 
    imagesListArray.append(image) 

    let dir = getUserDir() 
    let archiveName = "\(dir)/iRecipeList-namesListArray" 
    NSKeyedArchiver.archiveRootObject(namesListArray, toFile: archiveName) 
    let archiveImage = "\(dir)/iRecipeList-imagesListArray" 
    NSKeyedArchiver.archiveRootObject(imagesListArray, toFile: archiveImage) 

    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 
    } 
} 

}

Спасибо всем!

 Смежные вопросы

  • Нет связанных вопросов^_^