0

UISearchBarとUITableViewを持つUIViewControllerがあります。テーブルビューは、最近の検索を表示するために使用されます。

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 に答える