0

NSRectsをsでラップNSValueして、NSMutableArrayに入れました。NSKeyedArchiverアプリに保存/読み込み機能を追加したいので、とを使用すると思いNSKeyedUnarchiverました。間違い! NSKeyedArchiver cannot archive structs。少し検索した後、同じ問題を抱えている人からのフォーラム投稿を見つけました。NSArchiver彼はとを使用してそれを解決しましたNSUnarchiver。私はそれを実装しましたが、もう一度、それは機能しませんでした。これでエンコードできますが、配列をデコードすると、NSRectsの配列が返されます。それらを配列に入れることさえできません!しかし、私は自分の直腸を取り戻すことができる限り、気にしません。しかしNSArray、オブジェクトを取得するためのメソッドしかないため、できません。構造体はオブジェクトではないため、rectを取得できません。これはどのように可能ですか?アーカイブされたrectを取得するにはどうすればよいですか?

MyDocument.mの一部:

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
    NSMutableArray *array = odview.ovals;
    return [NSArchiver archivedDataWithRootObject:array];
}

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
    NSMutableArray *array = [NSUnarchiver unarchiveObjectWithData:data];
    NSMutableArray *newOvals = [NSMutableArray array];
    NSLog(@"array: %@", array);
    NSUInteger i, count = [array count];
    for (i = 0; i < count; i++) {
        NSRect rect = [array objectAtIndex:i];            // I can't do that because a struct is not an object!
        [newOvals addObject:[NSValue valueWithRect:rect]];
    }
    odview.ovals = newOvals;
    return YES  ;
}

ラップしているNSValueが消える可能性はありますか?また、NSRectを安全に保存およびロードするにはどうすればよいですか?

4

1 に答える 1

0

最も簡単な方法は、NSStringFromCGRectとCGRectFromStringを使用して前後に変換することです。つまり、rectsを文字列として配列に格納してから、writeToFile:atomically:(またはwriteToURL:atomically:)を使用して配列を保存します。

于 2013-01-30T17:31:23.007 に答える