在NSUserDefaults中保存最近的搜索

时间:2012-10-02 08:39:23

标签: iphone objective-c ios

我的UIViewController有一个UISearchBar和UITableView。表格视图用于显示最近的搜索。

我正在使用NSUserDefaults来保存搜索文本。

以下是我正在做的事情:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    DLog(@"Search")
    NSString *searchText = [self.searchBar text];
    [self.recentSearchesDict setObject:searchText forKey:searchText];

    self.recentSearchesStrings = [[self.recentSearchesDict allValues] mutableCopy];

    [self saveRecentSearches];

    [self.recentSearchList reloadData];
}

我将NSMutableDictionary中的文本对象保存为与键相同的文本,以避免表视图中出现重复条目​​。

- (void)saveRecentSearches
{
    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];

    if (self.recentSearchesDict) {
        [currentDefaults setValue:self.recentSearchesDict forKey:@"recentSearchesArray"];
    }

}

将NSMutableDictionary保存到NSUserDefaults。

在viewDidLoad中我称之为:

- (void)loadRecentSearches
{
    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
    self.recentSearchesDict = [[currentDefaults objectForKey:@"recentSearchesArray"] mutableCopy];

    if (!self.recentSearchesDict) {
        self.recentSearchesStrings = [[NSMutableArray alloc] init];
        self.recentSearchesDict = [NSMutableDictionary dictionary];

        return;
    }

    self.recentSearchesStrings = [[self.recentSearchesDict allValues] mutableCopy];
}

用于填充表视图我正在使用NSMutableArray对象recentSearchesStrings。

问题在于,当数组从字典中获取所有值时,它们不是最新的。

我希望最新的内容显示在列表的顶部。

有任何帮助吗?还有其他更好的方法来实现预期的任务吗?

2 个答案:

答案 0 :(得分:2)

如果要保留顺序,则不应使用字典来保存最近的搜索,因为字典中的键/值对没有已定义的顺序。

您应该将recentSearchesStrings数组本身存储在用户默认值中。要在删除重复项时向项目添加项目,您可以执行

[self.recentSearchesStrings removeObject:searchText];
[self.recentSearchesStrings insertObject:searchText atIndex:0];

答案 1 :(得分:0)

好吧,NSDictionary是一个哈希映射,当你遍历键或值时,它不是保持顺序的。在NSArray保存时,使用NSUserDefaults保留订单。

删除重复项与序列化有序列表无关。分开你的担忧。