0

我有 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。

问题是当数组从字典中获取所有值时,它们的顺序不是最近的。

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

有什么帮助吗?还有其他更好的方法来完成所需的任务吗?

4

2 回答 2

2

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

您应该将recentSearchesStrings数组本身存储在用户默认值中。要在删除重复项的同时将项目添加到数组中,您可以这样做

[self.recentSearchesStrings removeObject:searchText];
[self.recentSearchesStrings insertObject:searchText atIndex:0];
于 2012-10-02T09:00:07.890 回答
0

好吧,这NSDictionary是一个哈希映射,当您遍历键或值时,它不会保留顺序。保存时用于NSArray保持顺序NSUserDefaults

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

于 2012-10-02T08:53:28.187 回答