0

NSStringに を追加してからNSMutableArray、配列をに追加してNSDataで保存しようとしていNSUserDefaultsます。しかし、配列は常に nil です。

これが私のコードです:

- (void)viewDidLoad {
    [super viewDidLoad];
    library = [[ALAssetsLibrary alloc] init];
    groups = [[NSMutableArray alloc] init];
    userDefaults = [[NSUserDefaults alloc] init];

    NSData *data = [userDefaults objectForKey:@"GroupArray"];

    groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"%i", [groups count]);
}

-(IBAction)newFolder {
    if (textField.text != nil) {
        NSString *string = textField.text.capitalizedString;
        [library addAssetsGroupAlbumWithName:string
                    resultBlock:^(ALAssetsGroup *group) {
                        NSLog(@"Created a folder named: %@", group);
                    }
                    failureBlock:^(NSError *error) {
                        NSLog(@"An error occured! - %@", error);
                    }
         ];
        [groups addObject:string];
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];
        [userDefaults setObject:data forKey:@"GroupArray"];

        NSLog(@"%i", [groups count]);
    }
    [self.view sendSubviewToBack:subView];
}

アプリが起動すると、コンソールに配列がNULL. 文字列を追加しようとすると、NSLog(@"%i", [groups count]);常に 0 が返されます。

なぜこれが起こるのですか?

4

2 に答える 2

1
userDefaults = [[NSUserDefaults alloc] init];
NSData *data = [userDefaults objectForKey:@"GroupArray"];

この場合、「GroupArray」プロパティがまだ存在しないため、コードが初めて実行さdataれるときになります。nil

groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];

を引数として呼び出すと同様に返されるため、これによりbebegroupsも発生します。nilunarchiveObjectWithData:nilnil

そのため、 in-newFolderでは、Objective-C で メソッドの呼び出し[groups addObject:string]が許可されているため、そこで例外は発生しません。で呼び出されたメソッドの戻り値は、またはです。[nil addObject:string]nilnilnil0

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];

これは、グループがdataであるためです。nilnil

だからあなたはいつも呼んでいます:

[userDefaults setObject:data forKey:@"GroupArray"];

data = nil

クイックフィックス:if (groups == nil) groups = [NSMutableArray array];の先頭に追加-newFolder

于 2013-05-08T07:27:17.013 に答える
0

NSUserDefaultsの新しいインスタンスを初期化して呼び出すたびに、ビューの didLoad メソッドで

NSData *data = [userDefaults objectForKey:@"GroupArray"]; 新しく作成されたオブジェクト

新しいインスタンスにはキー @"GroupArray" のオブジェクトがないため、これは常に nil を返します。代わりに、userDefaultsをシングルトン オブジェクト[NSUserDefaults standardUserDefaults]に置き換えます。

以下に示すようにコードを変更します

- (void)viewDidLoad 
{
     [super viewDidLoad];
     library = [[ALAssetsLibrary alloc] init];
     NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"GroupArray"];

     groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];
     if (!groups)
     {
         groups = [[NSMutableArray alloc] init];    
     }
     NSLog(@"group %@", groups);
     NSLog(@"%i", [groups count]);
}     

あなたの newFolder メソッド

  -(IBAction)newFolder 
  {
     if (textField.text != nil) 
     {
          NSString *string = textField.text.capitalizedString;
         [library addAssetsGroupAlbumWithName:string
                     resultBlock:^(ALAssetsGroup *group) {
                         NSLog(@"Created a folder named: %@", group);
                     }
                     failureBlock:^(NSError *error) {
                         NSLog(@"An error occured! - %@", error);
                     }
          ];
        [groups addObject:string];
         NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];

        [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"GroupArray"];
        [[NSUserDefaults standardUserDefaults] synchronize];

         NSLog(@"%i", [groups count]);
     }
     [self.view sendSubviewToBack:subView];
 }

これはうまくいくはずです。それは私のために働いたので。

于 2013-05-08T09:02:59.320 に答える