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



这是我的第一篇堆栈文章,所以在复习我的发布技巧时请富有建设性!

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

我应该指出,我的小部件设置正确,就像在中一样,我已经将它和包含的应用程序正确地链接在"组"中。我还成功地使用了NSUserDefaults将NSString数组传递到小部件,但是,当我试图将对象数组传递到该小部件时,它会崩溃,我的日志显示:

*** 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"半部分插入到today小部件中时,我得到了前面提到的错误。以下是我的代码,展示了我如何对对象进行编码/解码(可能值得注意的是,创建此对象是为了简化调试,并且只包含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是有效的,这让我感到困惑。

我意识到这篇文章与我自己的问题非常相似,但作者决定选择一种变通方法,而我实际上想知道为什么这不起作用。我是一名新的开发人员,我正在尽我所能学习最佳工作实践,因此任何建议都将不胜感激。

我认为也可以用NSDictionary替换我的对象(类)?然而,如果可能的话,我希望避免这种情况,因为这会在主应用程序中引起许多冲突,但很明显,如果这是正确的方法,我会解决这个问题。顺便说一句,如果出于任何其他原因(例如内存或可访问性),字典比满足我的需求的对象(具有UIImage、CLLocation等属性的待办事项列表)更好,请详细说明并帮助我理解原因!

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

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

最新更新