4

こんにちは私は私のALAsset URLセーブを持っていますNSMutableArray

"ALAsset - Type:Photo, URLs:assets-library://asset/asset.JPG?id=119A0D2D-C267-4B69-A200-59890B2B0FE5&ex‌​t=JPG", 
"ALAsset - Type:Photo, URLs:assets-library://asset/asset.JPG?id=92A7A24F-D54B-496E-B250-542BBE37BE8C&ex‌​t=JPG", 
"ALAsset - Type:Photo, URLs:assets-library://asset/asset.JPG?id=77AC7205-68E6-4062-B80C-FC288DF96F24&ex‌​t=JPG

エラーが発生したためNSMutableArray、保存できません でした。これを使用することを考えています。NSUserDefaultsNote that dictionaries and arrays in property lists must also contain only property values.

            - (void)encodeWithCoder:(NSCoder *)encoder {
                //Encode properties, other class variables, etc
                [encoder encodeObject:self.selectedPhotos forKey:@"selectedPhotos"];
            }

            - (id)initWithCoder:(NSCoder *)decoder {
                if((self = [super init])) {
                    //decode properties, other class vars
                    self.selectedPhotos = [decoder decodeObjectForKey:@"selectedPhotos"];
                }
                return self;
            }

次に、次のコードで保存して取得します。

            - (void)saveCustomObject:(MyCustomObject *)obj {
                NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:obj];
                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                [defaults setObject:myEncodedObject forKey:@"myEncodedObjectKey"];
            }

            - (MyCustomObject *)loadCustomObjectWithKey:(NSString *)key {
                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                NSData *myEncodedObject = [defaults objectForKey:key];
                MyCustomObject *obj = (MyCustomObject *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
                return obj;
            }

しかし、私はどういうわけかそれを完全に理解していません、それでも私のコードでクラッシュします。方法がわからない。そして、NSUserDefaultsに保存できませんでした。誰かが助けてくれることを願っています。本当にしばらくの間、これに問題がありました。誰かが私にそれを保存してから正しい方法で取得する正しい道を案内してくれることを願っていますNSUserDefaults。次に、に戻りNSMutableArrayます。

4

3 に答える 3

3

NSUserDefaultsは、制限されたクラスのセットのみをオブジェクトとして受け取ります。ドキュメントを参照してください。これらの型 (NSData、NSString、NSNumber、NSDate、NSArray、または NSDictionary、そしてもちろん再帰的に適用されます) の値をディクショナリに格納することだけに注意する必要があります。

URL を に保存するには、URL をNSUserDefaults文字列として保存してから、URL として読み戻します。ディクショナリを現在の形式にする必要がある場合は、保存する前に変換する必要がある場合があります。

- (void) saveMyUrls
{
    NSMutableArray* urls = [NSMutableArray arrayWithCapacity:self.myUrls.count];
    for(NSURL* url in self.myUrls) {
        [urls addObject:[url absoluteString]];
    }
    [[NSUserDefaults standardUserDefaults] setObject:urls forKey:@"myUrls"];
}


- (void) loadUrls
{
    NSArray* urls = [[NSUserDefaults standardUserDefaults] objectForKey:@"myUrls"];
    self.myUrls = [NSMutableArray arrayWithCapacity:urls.count];
    for(NSString* urlString in urls) {
        [self.myUrls addObject:[NSURL URLWithString:urlString]];
    }
    [[NSUserDefaults standardUserDefaults] setObject:urls forKey:@"myUrls"];
}

NSDictionaryURL 以外の情報 (ユーザー指定のラベルなど) を保存する必要がある場合は、代わりにオブジェクトを として保存できます。

- (void) saveMyUrlsWithLabels
{
    NSMutableArray* objs = [NSMutableArray arrayWithCapacity:self.myObjects.count];
    for(MyObject* obj in self.myObjects) {
        [objs addObject:[NSDictionary dictionaryWithKeys:@"url", @"label"
            forObjects:obj.url.absoluteString, obj.userSpecifiedLabel];
    }
    [[NSUserDefaults standardUserDefaults] setObject:objs forKey:@"myObjects"];
}
于 2012-10-16T11:32:35.547 に答える
1

たぶん、次のようにする必要があります。

- (MyCustomObject *)loadCustomObjectWithKey:(NSString *)key {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults synchronize]; // note this
    NSData *myEncodedObject = [defaults objectForKey:key];
    MyCustomObject *obj = nil;

    // it would be even better
    // to wrap this into @try-@catch block
    if(myEncodedObject)
    {
        obj = (MyCustomObject *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
    }

    return obj;
}

NSKeyedArchiverまた、使用したい場合NSKeyedUNarchiverMyCustomObjectクラスがNSCodingプロトコルに準拠している必要があることに注意してください。NSCoding プロトコル リファレンスArchives and Serializations Programming Guideを確認してください。

于 2012-10-16T11:40:07.753 に答える
1

これは別の方法であり、NSUserDefaults を使用できます。基本的に、アセット URL を取得して保存し、アセット / 画像に変換します。

//SET IT
ALAsset *asset3 = [self.assets objectAtIndex:[indexPath row]];
    NSMutableString *testStr = [NSMutableString stringWithFormat:@"%@", asset3.defaultRepresentation.url];

    //NSLog(@"testStr: %@ ...", testStr);

    [[NSUserDefaults standardUserDefaults] setObject:testStr forKey:@"userPhotoAsset"];
    [[NSUserDefaults standardUserDefaults] synchronize];


//GET IT 
NSString *assetUrlStr = [[NSUserDefaults standardUserDefaults] objectForKey:@"userPhotoAsset"];
    NSURL* aURL = [NSURL URLWithString:assetUrlStr];
    NSLog(@"aURL: %@ ...", aURL);

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library assetForURL:aURL resultBlock:^(ALAsset *asset)
     {
         UIImage  *copyOfOriginalImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage] scale:1.0 orientation:UIImageOrientationUp];

         imgVwPortrait.image = copyOfOriginalImage;

     }
            failureBlock:^(NSError *error)
     {
         // error handling
         NSLog(@"failure-----");
     }];
于 2014-03-04T01:01:58.290 に答える