2012-10-02 84 views
0

我有UIViewController有一個UISearchBar和UITableView。表格視圖用於顯示最近的搜索。保存最近的搜索在NSUserDefaults

我正在使用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。

問題是,當數組從字典中獲取所有值時,它們不是按照最近的順序。

我希望最新的內容顯示在列表頂部。

任何幫助?有沒有其他更好的方法來實現預期的任務?

+1

保存一個數組而不是一個字典:字典是不排序的,數組是。 – meronix

+0

[currentDefaults synchronize]; – Rajneesh071

回答

2

如果要保留順序,則不應使用字典來保存最近的搜索,因爲字典中的鍵/值對沒有定義的順序。

您應該將recentSearchesStrings數組本身存儲爲用戶默認值。要添加一個項目到陣列,同時刪除重複項,你可以做

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

謝謝!它現在的工作:) –

0

那麼,NSDictionary是一個哈希映射,當您迭代鍵或值時,它不是順序保留。在NSUserDefaults中保存時使用NSArray來保存訂單。

刪除重複項與序列化有序列表無關。分開你的顧慮。