我正在尝试复制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个文件夹堆栈一样?
答案 0 :(得分:1)
这里的问题是,当从用户默认值中获取数据时,它们是不可变的 - 即它们是NSArray
或NSDictionary
的实例,而不是NSMutableArray
或{{1} }。您可能想要克隆感兴趣的对象,即在它们上面调用NSMutableDictionary
并在数据结构中替换它们。