标签: nscoding

NSCoding协议问题

我想将归档(NSCoding)协议添加到我的模型类,然后我实现这两个方法encodeWithCoder:(NSCoder*)coderinitWithCoder:(NSCoder*)coder.MyModelClass有2个实例变量(NSString和NSImage),所以我使用该encodeObject:(id)object forKey:(NSString*)string方法对对象进行编码,加上特定键的值.但我一直得到错误:

*** -encodeObject:forKey: only defined for abstract class. Define -[NSArchiver encodeObject:forKey:]!

这是我的NSCoding方法的代码:

- (id)initWithCoder:(NSCoder *)coder {
 [super init];
 mainPath = [[coder decodeObjectForKey:@"mainPath"] retain];
 icon = [[coder decodeObjectForKey:@"icon"] retain];

 return self;
}

- (void)encodeWithCoder:(NSCoder *)coder {
 NSLog(@"encode with coder is called");
 [coder encodeObject:mainPath forKey:@"mainPath"];
 [coder encodeObject:icon forKey:@"icon"];

}
Run Code Online (Sandbox Code Playgroud)

这就是我在控制器类中调用它们的方式:

id object = [assetArray objectAtIndex: [[rows lastObject] intValue]];

 if ([object isKindOfClass:[ItemAssetModel class]])
  NSLog(@"object is correct");
 else
  return NO;

 NSData *data = [NSArchiver archivedDataWithRootObject: object];
Run Code Online (Sandbox Code Playgroud)

如果我更改了 …

cocoa objective-c nscoding

4
推荐指数
1
解决办法
2262
查看次数

Cocoa Interface Builder对象初始化

基于我所经历的文档和示例代码,我得到的印象是,当在Interface Builder中读取并配置在xcode中定义的类时,基于该类的对象被有效地创建并存储在xib或nib文件中.因此,在启动相应的应用程序时,可以使用该对象.

或者,对于尚未由Interface Builder处理的类,必须在xcode中显式编写诸如"new"语句之类的代码,以便创建和使用关联的对象.

拥有比我更了解的人来确认或纠正我对Interface Builder的非常天真的理解将是非常好的...

cocoa objective-c nscoding nib

4
推荐指数
1
解决办法
2756
查看次数

NSKeyedArchiver返回意外的课程?

我有一个扩展的自定义类NSString.我正在尝试使用一个序列化它(用于拖放)NSKeyedArchiver.该类重写...Coder方法:

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        data = [[aDecoder decodeObjectForKey:@"data"] copy];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [super encodeWithCoder:aCoder];
    [aCoder encodeObject:self.data forKey:@"data"];
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试实际执行归档/取消归档时:

MyClass *object = [[MyClass alloc] init];
[pboard setData:[NSKeyedArchiver archivedDataWithRootObject:object] forType:SACP_WRAPPER_DRAG_TYPE];
NSLog(@"Wrote data for class %@", [object class]);

...

id item = [NSKeyedUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:SACP_WRAPPER_DRAG_TYPE]];
NSLog(@"Read data for class %@", [item class]);
Run Code Online (Sandbox Code Playgroud)

输出不是我所期望的:

2011-10-15 18:56:22.898 MyApp[7402:707] Wrote data for class ASCIIString
2011-10-15 18:56:23.345 …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c nscoding nsstring

4
推荐指数
1
解决办法
281
查看次数

编码NSMutableArray

我有一个包含各种NSString对象和变量的对象,我将这些对象和NSCoding归档到磁盘上的文件中,然后取消归档.到目前为止,一切都运作良好.

今天,我想在对象中添加一个NSMutableArray并尝试使用以下代码进行编码:

[encoder encodeObject:myArray ForKey:@"myArray"];
Run Code Online (Sandbox Code Playgroud)

然后使用以下方法解码它:

[self setMyArray:[decoder decodeObjectForKey:@"myArray"]];
Run Code Online (Sandbox Code Playgroud)

它似乎没有工作,虽然我没有在编码或解码本身中得到任何错误,但如果我尝试在从文件解码后修改数组的值,我会收到错误.

我确定我在这里做了一些完全错误的事情,但并不完全确定是什么.我想也许它可能与它没有在unarchive期间正确分配有关.

什么看起来明显是问题的根源?

xcode nscoding nsmutablearray

4
推荐指数
1
解决办法
4163
查看次数

Swift枚举和NSCoding

我有一个带有String属性和NSImage属性的'Thing'对象; Thing类有encodeWithCoder:和decodeWithCoder:方法,我可以使用NSKeyedArchiver/Unarchiver归档和解压缩[Thing]数组.

到现在为止还挺好.现在我想通过一系列方向扩展我的Thing类,其中'Direction'是以下枚举:

enum Direction{

case North(direction:String)
case East(direction:String)
case South(direction:String)
case West(direction:String)

}
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望存储的数据是

thing1.directions: Direction = [.North("thing2"), .South("thing3")]
Run Code Online (Sandbox Code Playgroud)

(在一个更完美的世界中,我将使用对我的东西的直接引用而不仅仅是它们的名称,但我意识到这将很容易创建引用循环 - 在创建Thing之前无法设置对另一个Thing的引用 - 所以我会克制.我正在寻找一种快速而又脏的方法来保存我的应用数据并继续前进.)

由于我将需要其他地方的指示,这是一个单独的实体,而不仅仅是Thing类中的枚举.(不确定这是否有所不同.)

使我的Direction枚举符合NSCoding的最佳方法是什么?我能提出的最好的解决方法是创建一个[String:String]字典,其中"North"和"South"作为键,"thing2"和"thing3"作为值,并从中重构我的enum属性,但是有一个更好的方法?就此而言,是否有一种方法可以使元组符合NSCoding,因为现在(String,String)让我"不兼容协议"AnyObject"'错误.

非常感谢.

enums nscoding swift

4
推荐指数
1
解决办法
3543
查看次数

将CLLocationCoordinate2D转换为可以存储的String

我正在尝试在一个ViewController中保存用户的坐标,以便它可以用于创建可以在另一个ViewController中显示的Annotation.

在视图控制器中,我使用代码存储坐标

NSUserDefaults.standardUserDefaults().setObject( Location, forKey: "Location")
Run Code Online (Sandbox Code Playgroud)

在地图视图控制器中显示我正在尝试使用代码获取坐标的注释

let Location = NSUserDefaults.standardUserDefaults().stringForKey("Location")
var Annotation = MKPointAnnotation()
Annotation.coordinate = Location    
Run Code Online (Sandbox Code Playgroud)

它告诉我type的值为type String?的值CLLocationCoordinate2D.

那么如何将CLLocationCoordinate2D坐标转换为类型的值String

location nscoding cllocation ios swift

4
推荐指数
1
解决办法
7849
查看次数

取消归档返回nil和不正确格式的编码数据

我已将类别方法添加到NSUserDefaults中以存储和检索编码的对象(在本例中为NSArray)。我在检索编码数据时遇到问题。这是我的代码:

- (void)encodeObject:(id<NSCoding>)object forKey:(NSString *)key {
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:NO error:nil];
    [self setObject:data forKey:key];
    [self synchronize];
}

- (id)decodeObjectForKey:(NSString *)key class:(Class)aClass {
    NSData *data = [self objectForKey:key];
    NSError *error = nil;
    id object = [NSKeyedUnarchiver unarchivedObjectOfClass:aClass fromData:data error:&error];
    NSLog(@"E: %@ %@", error.localizedDescription, object);
    return object;
}
Run Code Online (Sandbox Code Playgroud)

调用[[NSUserDefaults standardDefaults] encodeObject:object forKey:key]应对传递的对象进行编码并将其存储为默认值,然后调用[[NSUserDefaults standardDefaults] decodeObjectForKey:key class:aClass应返回编码的对象。

问题是[NSKeyedUnarchiver unarchivedObjectOfClass:fromData:error:]返回nil,错误文本记录为The data couldn’t be read because it isn’t in the correct format.。使用检索的数据[self objectForKey:] …

nscoding nskeyedarchiver ios nskeyedunarchiver

4
推荐指数
4
解决办法
3663
查看次数

符合nscoding的对象不会写入文件

我想写一个Question对象数组到文件,但不知何故writeToFile没有做任何事情.一个问题有一个所有者和一组Answer对象.答案也有所有者.所有这三个都符合NSCoding协议(据我所知).

从下面的代码中,结果返回NO.不知道我做错了什么,因为我正在为所有事情实施NSCoding,对吧?

Question.h

#import <Foundation/Foundation.h>
#import "Owner.h"

@interface Question : NSObject <NSCoding> {
    NSString *questionId;
    NSString *questionRevision;
    NSString *text;
    NSDate *date;
    NSMutableArray *answers;
    NSString *page;
    NSNumber *questionLocation;

    Owner *owner;
}

@property (nonatomic, retain) NSString *questionId;
@property (nonatomic, retain) NSString *questionRevision;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSMutableArray *answers;
@property (nonatomic, retain) NSString *page;
@property (nonatomic, retain) NSNumber *questionLocation;
@property (nonatomic, retain) Owner *owner;

@end
Run Code Online (Sandbox Code Playgroud)

Question.m

#import "Question.h"
#import "Answer.h"

@implementation Question

@synthesize questionId, …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c nscoding

3
推荐指数
1
解决办法
3337
查看次数

NSCoder和/或NSKeyedUnarchiver如何处理同一对象的多个解码?

我想知道如何NSCoder处理下次解码时由多个对象共享和编码的对象.它会制作对象的两个副本,还是会解码并在解码它的所有其他对象之间共享一个对象?

我提供了一个类似下面这种情况的小例子.

例:

  1. 应用程序启动
  2. 对象A和对象B将对象C设置为其委托
  3. 应用程序收到终止通知
  4. 对象A和对象B 编码自身及其所有对象(包括其委托)
  5. 应用程序关闭并重新启动
  6. 对象A和对象B 解码自身及其所有对象(包括其委托)

对象A和对象B在步骤6之后是否共享相同的解码对象,或者它们各自都有自己的副本?

macos objective-c nscoding cocoa-design-patterns nscoder

3
推荐指数
2
解决办法
1026
查看次数

用于NSCoding的Swift 2.0单元测试

我将尝试使用Xcode 7(代码覆盖率)和Swift 2.0中的新测试功能.

使用代码覆盖,我发现我没有测试我的NSCoding方法.

在此输入图像描述

有关保存一些细节的简单示例,例如

required init(coder aDecoder: NSCoder) {
    name = aDecoder.decodeObjectForKey("name") as! String
    time = aDecoder.decodeIntegerForKey("time")
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeInteger(time, forKey: "time")
    aCoder.encodeObject(name, forKey: "name")
}
Run Code Online (Sandbox Code Playgroud)

我如何在XCTest类中测试这些方法.

unit-testing nscoding swift

3
推荐指数
1
解决办法
1477
查看次数