我的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。
问题在于,当数组从字典中获取所有值时,它们不是最新的。
我希望最新的内容显示在列表的顶部。
有任何帮助吗?还有其他更好的方法来实现预期的任务吗?
答案 0 :(得分:2)
如果要保留顺序,则不应使用字典来保存最近的搜索,因为字典中的键/值对没有已定义的顺序。
您应该将recentSearchesStrings
数组本身存储在用户默认值中。要在删除重复项时向项目添加项目,您可以执行
[self.recentSearchesStrings removeObject:searchText];
[self.recentSearchesStrings insertObject:searchText atIndex:0];
答案 1 :(得分:0)
好吧,NSDictionary
是一个哈希映射,当你遍历键或值时,它不是保持顺序的。在NSArray
保存时,使用NSUserDefaults
保留订单。
删除重复项与序列化有序列表无关。分开你的担忧。