0

我正在尝试复制 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是条目是否为文件夹,书签是书签数组或多个文件夹。

整个主线NSArrayNSUserDefaults.

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

-(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 个文件夹堆栈?

4

1 回答 1

1

您的问题是,当从用户默认值中获取数据时,它们是不可变的——即它们是NSArrayor的实例NSDictionary,而不是NSMutableArrayor的实例NSMutableDictionary。您可能想要克隆感兴趣的对象,即调用mutableCopy它们并在您的数据结构中替换它们。

于 2012-10-14T08:12:41.587 回答