1

誰かが私を助けてくれることを願っています:

NSDictionaryを埋めるために aを使用していUITableViewます。そのモデルはのようなもの[key:userID => value:userName]です。tableView には userName のみが入力されますが、クリックすると関連する userID を送信する必要があります。をフィルタリングしたいときに問題が発生しますUITable。ディクショナリを (述語を使用して) 変換することによってディクショナリをフィルタリングする方法を見つけただけですがNSArray、ユーザー名とユーザー ID の関係が失われます。

解決策は、イニシャルNSDictionaryをフィルター処理してフィルター処理されたものを取得することですNSDictionary(まだリレーショナル キー/値を使用) が、その方法がわかりません。配列を取得するための解決策しか見つかりませんでした。

どうすればそれを行うことができますか、それを行うためのより良い解決策はありますか?

4

4 に答える 4

1

もっと良い解決策があります、フランソワ。NSDictionaryあなたから(ここではそれを呼び出しますmyDictionary)、次のように作成します(NSArrayインターフェースファイルで宣言します):

NSArray *arrayForTableView;

次に、NSDictionary をロードした直後に、次の操作を行います。

arrayForTableView = [myDictionary allKeys]; // so you will have an array of all UserID's

今、あなたのtableView: cellForRowAtIndexPath:方法では、次のようにすることができます:

cell.textLabel.text = [myDictionary objectForKey:[arraForTableView objectAtIndex:indexPath.row]];

そして、ユーザーがセルを選択したときにユーザー ID を渡したい場合は、次のtableView: didSelectRowAtIndexPath:ようにします。

id userIDSelected = [arraForTableView objectAtIndex:indexPath.row];

次に、検索に従って配列をフィルタリングする場合は、次のarrayForTableViewように NSDictionary を「スキャン」することで、単純に を再作成できます。

NSString *typedString;
NSMutableArray *arrayFiltered = [NSMutableArray array];
for (int i = 0; i < [[myDictionary allKeys] count]; i++)
{
    if ([[myDictionary objectForKey:[[myDictionary allKeys] objectAtIndex:i]] rangeOfString:typedString].location != NSNotFound)
    {
        [arrayFiltered addObject:[[myDictionary allKeys] objectAtIndex:i]];
    }
}

arrayForTableView = arrayFiltered;

この方法では、UITableView の dataSource とデリゲート メソッドを変更する必要さえありません。

于 2013-04-28T10:38:20.843 に答える
0

NSDictionary を使用して UITableView を設定していますが、この UITableView には、実行して取得したユーザー名のみが入力されています

[dictionary objectForKey@"userID"];

NSDictionary には allkeys と allValues の 2 つの関数があります

NSArray* allUserID = [dictionary allKeys];
NSArray* allUserNames = [dictionary allValues];

これは並列配列であるため、1 つの配列のインデックスは、関連する配列と並列に実行されます。

テーブル セルの各セルは、独自の ID とユーザー名への参照を保持するカスタム クラスにすることもできます。これにより、セルのみを渡してそのデータを取得できます。

これらの関数については、NSDictionary のドキュメントで読むことができます

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html

于 2013-04-28T10:47:18.140 に答える
0

次のようにして、選択したキー (userName) の値 (userID) を取得できます。

//iterate through whole dictionary
for(id key in yourNSDictionary)
{
   // if key is the userName clicked
   if([key isEqualToString:selectedUserName])
   {
       //userID for clicked userName
       int userID = [yourNSDictionary objectForKey:@selectedUserName];
   }
}
于 2013-04-28T10:45:24.087 に答える
0

NSDictionary 値を持つ NSArray または NSMutableArray を作成することをお勧めします - UITableViews は、配列インデックスが行番号と一致する配列によって駆動されることを意図しています。次に、データ構造を考慮した辞書の配列用のカスタム フィルターを簡単に作成できます。コードには、次のサンプル コードの一部が含まれる場合があります。

NSString *idKey = @"userId";
NSString *nameKey = @"userName";
NSArray *arr = @[
        @{
                idKey : @(24),
                nameKey : @"Oil Can Henry"
        },
        @{
                idKey : @(32),
                nameKey : @"Doctor Eggman"
        },
        @{
                idKey : @(523),
                nameKey : @"Sparticus"
        },
];
NSString *searchTerm = @"Spar";
NSArray *newArray = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return [evaluatedObject[nameKey] hasPrefix:searchTerm];
}]];

利点:

  • すべてのデータを表す単一のデータ構造
  • 固有の決定論的な順序付け
  • NSPredicate フィルタリングのサポート
于 2013-04-28T11:10:15.640 に答える