自动命名 NSUserDefaults
Posted
技术标签:
【中文标题】自动命名 NSUserDefaults【英文标题】:Name NSUserDefaults Automatically 【发布时间】:2012-03-05 01:00:57 【问题描述】:请原谅,因为这有点难以解释。我会努力的!
所以,我正在创建书签。我已经将 WebView 的 URL 带到您可以设置和显示它的表格中。这适用于一个书签。代码如下所示:
//Gets Page (currentAddress is the address of the webview passed to the bookmarks)
NSString *address = [defaults objectForKey:@"currentAddress"];
//Adds Set URL To Defaults (defaults is the name for the NSUserDefaults declaration)
[defaults setObject:address forKey:@"savedAddress1"];
//Adds To Array (favorites is the mutable array that the table displays)
[favorites addObject:address];
//Syncs Defaults
[defaults synchronize];
//Animate Back To Home Screen
[self dismissModalViewControllerAnimated:YES];
但是,当您添加新书签时,它们只会相互覆盖。您如何能够连续命名它们,以免它们自动覆盖彼此?请记住,我需要知道如何获取要删除的索引并检查它是否为 nil。
所以,拜托,如果你有什么能在这种情况下帮助我,那就太好了。我在想也许在 NSUserDefaults 中使用一个数组来跟踪,但我不知道,我需要你的帮助!
感谢您的宝贵时间!
--杰克
【问题讨论】:
一个NSArray
可以插入NSUserDefaults
。
太棒了!只是..您将如何自动命名数组的每个部分?
【参考方案1】:
如果您的数据结构过于复杂,您应该考虑另一种存储方法。
您可能会使用 NSDictionary
,其中 Key 是书签的名称,而 value 是书签地址。
"Google" = "http://google.com"
当你加载你的数据源时,你应该从NSUserDefaults
获取字典
self.bookmarks = [[userDefaults dictionaryForKey:URDictionaryKey] mutableCopy];
为了让您的表格保持有序,您可以为已排序的字典键创建一个NSArray
。
self.bookmarkKeys = [[self.bookmarks allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
对于您的数据源方法,您可以使用类似
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
return [self.bookmarkKeys count];
对于单元配置,您可以使用以下内容:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
NSString *title = [self.bookmarkKeys objectAtIndex:indexPath.row];
cell.textLabel.text = title;
cell.detailTextLabel.text = [self.bookmarks objectForKey:title];
return cell;
如果用户删除了表中的一行,您会执行以下操作:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
if (editingStyle == UITableViewCellEditingStyleDelete)
NSString *key = [self.bookmarkKeys objectAtIndex:indexPath.row];
[self.bookmarks removeObjectForKey:key];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:self.bookmarks forKey:URDictionaryKey];
[defaults synchronize];
更新
您需要使用NSMutableDictionary,它是NSDictionary 的子类,因此查看两者的文档将有助于您理解。
在这种情况下,您将从一个空的可变字典开始
self.bookmarks = [NSMutableDictionary dictionary];
然后,当用户添加书签时,您将其添加到字典中,名称为key
,目标为value
[self.bookmarks setObject:@"http://google.com" forKey:@"Google"];
【讨论】:
相信我,作为一个初学者(我已经使用 XCode 大约 2 个月),这将是艰难的。我以前从未使用过 NSDictionary。您的其余答案似乎很简单,但是您如何设置 NSDictionary?谢谢! =D 我使用了一个复杂的布尔系统。它检查条目是否为零,如果是,则在此处添加书签。我遇到的唯一问题是删除它们.. 你怎么知道哪一行被删除,以便我可以将该行的 NSDefault 设置为 nil?tableView:commitEditingStyle:forRowAtIndexPath
为您提供 indexPath。如果没有看到一些代码,很难想象你的设置,所以我真的帮不上太多忙
我把它放在一起,最后,简单了 1000 倍。我只是将整个数组添加到 NSUserDefaults,然后将该数组加载到表加载时显示的数组中,当您更改表显示的数组时,它会保存回默认值中的数组。以上是关于自动命名 NSUserDefaults的主要内容,如果未能解决你的问题,请参考以下文章