自动命名 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的主要内容,如果未能解决你的问题,请参考以下文章

2)thinkphp的带有命名空间的自动加载机制

在另一个命名空间中自动加载命名空间时出错

如何自动填充命名单元格?

PHP 类的命名空间 和自动载入

自动打开命名管道和 tcp\ip

unity的assetbundle的自动命名,以我的命名lua为例