在NSArrays中保存NSDictionary实例的问题

时间:2012-10-14 06:37:29

标签: objective-c nsmutablearray nsarray nsdictionary

我正在尝试复制iOS Safari书签系统。我有单独的书签工作和主集中的文件夹工作。我需要帮助,所以我可以在其他文件夹中有无限的文件夹。基本上,我的代码现在只能保存到1个文件夹,所以主文件夹→文件夹1→文件夹2,但不能过去那个。我必须在创建文件夹1后退出应用程序以保存其中的任何内容。 Xcode给了我这个错误:

WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: <NSInternalInconsistencyException> -[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object

这就是文件夹字典的样子:

NSDictionary *NewFolderDict = @{
    @"Title" : NewFolderTitle,
    @"isFolder" : @YES ,
    @"Bookmarks" : @[],
    @"UUID" : [self uuidString]
};

Title是条目的名称,isFolder是条目是否是文件夹,书签是书签数组或更多文件夹。

整个主NSArray位于NSUserDefaults

这就是我现在保存文件夹的方式。当用户在视图控制器中按下键盘上的完成按钮时,将调用此代码:

-(void)addDictionary:(NSDictionary *)FolderDictionary toFolder:(NSMutableDictionary*)toFolder {

    NSMutableArray *bookmarks = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"bookmarks"]];
    for (int i=0; i<[bookmarks count]; i++) {

        NSMutableDictionary *Bookmark = (NSMutableDictionary *)[bookmarks objectAtIndex:i];

        if ([[Bookmark objectForKey:@"isFolder"] boolValue] == YES) {

            if ([[Bookmark objectForKey:@"UUID"] isEqualToString:[toFolder objectForKey:@"UUID"]]) {
                NSLog(@"MATCH");
                NSMutableArray *test = (NSMutableArray *)[Bookmark objectForKey:@"Bookmarks"];
                [test addObject:FolderDictionary];

            }

        }

    }
    NSLog(@"%@",bookmarks);
    [[NSUserDefaults standardUserDefaults] setObject:bookmarks forKey:@"bookmarks"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [bookmarks release];

}

这只是检查它是否是一个文件夹,以及它是否是要添加的正确文件夹。我怎样才能让它在100%的时间里都能正常工作,然后保存它,并使其无法限制它可以减少多少个文件夹,这就像10个文件夹堆栈一样?

1 个答案:

答案 0 :(得分:1)

这里的问题是,当从用户默认值中获取数据时,它们是不可变的 - 即它们是NSArrayNSDictionary的实例,而不是NSMutableArray或{{1} }。您可能想要克隆感兴趣的对象,即在它们上面调用NSMutableDictionary并在数据结构中替换它们。