ios – 使用NSUserDefaults与Today Extension(小部件)共享一组自定义对象

ios – 使用NSUserDefaults与Today Extension(小部件)共享一组自定义对象,第1张

概述这是我的第一篇论文帖子,所以在审核我的帖子技巧时请建设性的! 基本上,我的问题是我有一系列自定义对象,我需要与今天的扩展共享.对象表示待办事项列表中的任务,其属性用于存储有关每个任务的信息(名称,位置,dueDate,缩略图等).对象存储在一个数组中,该数组用于填充我的待办事项列表.我想做的就是将这个数组传递给我的小部件,这样我就可以填充第二个tableview,它将作为第一个的压缩版本(对于wi 这是我的第一篇论文帖子,所以在审核我的帖子技巧时请建设性的!

基本上,我的问题是我有一系列自定义对象,我需要与今天的扩展共享.对象表示待办事项列表中的任务,其属性用于存储有关每个任务的信息(名称,位置,dueDate,缩略图等).对象存储在一个数组中,该数组用于填充我的待办事项列表.我想做的就是将这个数组传递给我的小部件,这样我就可以填充第二个tablevIEw,它将作为第一个的压缩版本(对于Widget视图).

我应该指出我的小部件已正确设置,因为我已将它与包含的应用程序正确地链接在“组”中.我还成功地使用NSUserDefaults将Nsstrings数组传递给窗口小部件,但是,当我尝试将对象数组传递给窗口小部件时,它崩溃了,我的日志显示为:

*** Terminating app due to uncaught exception 'NSInvalIDUnarchiveOperationException',reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (Xitem)'

我知道这次崩溃与归档对象(Xitem)有关,这似乎是在NSUserDefaults中保存自定义对象的必要步骤.但是,我已经测试了在包含应用程序的同一类中保存/加载数组,并且工作正常! (以下代码)

NSData *encodedobject = [NSKeyedArchiver archivedDataWithRootObject:self.Xitems];        NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuitename:@"group.AaronTest"];        [defaults setobject:encodedobject forKey:@"myArray"];        [defaults synchronize];        NSUserDefaults *defaults2 = [[NSUserDefaults alloc] initWithSuitename:@"group.AaronTest"];        NSData *encodedobject2 = [defaults2 objectForKey:@"myArray"];        NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithData:encodedobject2];        for (Xitem *t in array2){            NSLog(@"*****%@*****",t.itemname);        }

好的,正如所解释的,上面的代码按预期工作.但是,当我将此代码的第二个“unarchiver”插入我今天的小部件时,我得到上述错误.下面是我的代码,以显示我如何编码/解码对象(可能值得注意的是,这个对象是为了简化我的调试而创建的,只包含一个Nsstring属性):

Xitem.h

#import <UIKit/UIKit.h>#import <Foundation/Foundation.h>@interface Xitem : NSObject <NSCoding> { Nsstring *itemname;}-(voID)encodeWithCoder:(NSCoder*)encoder;-(ID)initWithCoder:(NSCoder*)decoder;@property Nsstring *itemname;@end

Xitem.m

#import "Xitem.h"@implementation Xitem@synthesize itemname;-(voID)encodeWithCoder:(NSCoder*)encoder{[encoder encodeObject:self.itemname forKey:@"iname"];}-(ID)initWithCoder:(NSCoder*)decoder{self = [super init];self.itemname = [decoder decodeObjectForKey:@"iname"];return self;}@end

我也可以发布我的小部件并包含应用程序代码,但它与我发布的第一组代码没有区别(除了重命名的变量,例如’defaults2′).我应该指出,在尝试解决这个问题时我确实耗尽了资源,但是仅仅在包含应用程序中使用NSKeyedArchiver这一事实让我感到难过.

我意识到this post与我自己的问题非常相似,但作者决定选择一种解决方法,而我实际上想知道为什么这不起作用.我是一名新开发人员,我正在尽最大努力接受最佳工作实践,因此我们将非常感谢您的建议.

我认为也可以用NSDictionary替换我的对象(类)?但是我想尽可能避免这种情况,因为它会在主应用程序中引起许多冲突,但显然如果这是正确的方法,我将解决这个问题.另外,如果一个字典比我的要求的对象(带有UIImage,CLLocation等属性的待办事项列表)出于任何其他原因(例如内存或可访问性),请做详细说明并帮助我理解为什么!

非常感谢任何人的时间:)

解决方法 好的,我刚刚解决了这个问题.如果有人遇到同样的问题,请转到:’目标’> ‘小部件’> ‘构建阶段’> ‘编译源’>在那里添加自定义类(Xitem.m) 总结

以上是内存溢出为你收集整理的ios – 使用NSUserDefaults与Today Extension(小部件)共享一组自定义对象全部内容,希望文章能够帮你解决ios – 使用NSUserDefaults与Today Extension(小部件)共享一组自定义对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1114195.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存