由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“-[ABDC.File encodeWithCoder:]:

时间:2019-08-27 09:41:30

标签: ios swift4.2

嗨,我正在尝试使用Userdefaults保存模型类中的数据,但由于某种原因,它已崩溃:

  

“由于未捕获的异常而终止应用程序   'NSInvalidArgumentException',原因:'-[abcd.File encodeWithCoder:]:   无法识别的选择器已发送到实例0x2806ff2a0'“

我提供了我在下面尝试过的模型类和代码。 File是我的模型类,它具有字符串和整数。谁能帮我解决这个问题,那太好了。

//Constants class
  static let sharedInstance = Constants()

    //to manager dev or production

    let _UserDefaults = UserDefaultsConstants()
    var file: [File] = []

    func setFile(filee:[File]) {
        file = filee
        //save to userdefaults
        self._UserDefaults.setFileData(file: filee)
    }


    func getFile() -> [File] {
        if file != file {
            return file
        }
        return self._UserDefaults.getFileData()
    }

//Userdefaults Class

    let defaults = UserDefaults.standard
    var emptyfile: [File] = []

    func save() {
        defaults.synchronize()
    }

    func setFileData(file: [File]) {
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: file)
        defaults.set(encodedData, forKey: "UserDefaultsResult")

    }

    func getFileData() -> [File] {
        if let myFile = defaults.value(forKey: "UserDefaultsResult") as? File {
            emptyfile = [myFile]
            return emptyfile
        }
        return emptyfile
    }
    func remove() {
        UserDefaults.standard.removeObject(forKey: "UserDefaultsResult")
    }



//Controller class

    Constants.sharedInstance._UserDefaults.setFileData(file: [self.filee])//Crashing here
            Constants.sharedInstance._UserDefaults.save()

1 个答案:

答案 0 :(得分:0)

您的自定义类'File'应该实现endcode和解码方法。

这里是一个示例:

    public void RunScheduledTasks()
    {
        //This generic way fails
        RunScheduledMethod(bar1, new TimeSpan(15, 31, 30)); //DOES NOTHING

        //This way works
        TimeSpan Time1 = new TimeSpan(15, 31, 30); 
        if (Time1 > DateTime.Now.TimeOfDay)
        {
            Time1 -= DateTime.Now.TimeOfDay;
            Task.Delay(Time1).ContinueWith(t => bar1()); //WORKS OK.
        }

    }
    public void RunScheduledMethod(Action methodToRun, TimeSpan TimeToRun)
    {
        TimeToRun -= DateTime.Now.TimeOfDay;
        Task.Delay(TimeToRun).ContinueWith(t => methodToRun);
    }
    public void bar1()
    {
        MessageBox.Show("Bar1 called" + DateTime.Now.TimeOfDay);
    }