11

キーの順序を考慮して、API によって返された NSDictionary のコンテンツを UITableView に表示する必要があります。

私は使用しています:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        NSString *key = self.data.allKeys[indexPath.section];
        NSArray *list = self.data[key];
        id data = list[indexPath.row];

        PSSearchCell *cell = [PSSearchCell newCellOrReuse:tableView];

        cell.model = data;

        return cell;
}

しかし、そうしてself.data.allKeysいるうちに、キーの順序が失われています。それらに関係がないため、値で並べ替えることはできません。

4

4 に答える 4

26

これを試して、

NSArray *keys = [myDictionary allKeys];
keys = [keys sortedArrayUsingComparator:^(id a, id b) {
    return [a compare:b options:NSNumericSearch];
}];

NSLog(@"%@",keys);

ソートされたキーに基づいて値を取得します。

編集

アルファベット順に並べ替えるには、これを試してください。

NSArray *keys = [myDictionary allKeys];
keys = [[keys mutableCopy] sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

NSLog(@"%@",keys);
于 2013-07-19T11:41:46.413 に答える
1

誰もが言ったように、NSDictionary は順序付けされていないため、NSDictionary ログに表示されるキーを順序付けできません。

代わりに配列を返すように API の人々に依頼しました。

0 => name : key 1
     value : value 1

1 => name : key 2
     value : value 2

/ -------------------------------------------------- --------------------------- /

残念ながら、そのように使用されるメソッド「sortedArrayUsingArray」はありません。

NSArray * arrayOne = [@"key E", @"key A", @"key C"];

NSArray * arrayTwo = [@"key A", @"key B", @"key C", @"key D", @"key E", @"key F"];

NSArray * orderedArray = [arrayOne sortedArrayUsingArray: arrayTwo];
于 2013-07-19T13:33:35.557 に答える
0

あなたはキーの順序を失っていると言ったので、NSArray. 右?そして、NSArrayあなたが望むように注文されたキーを持っているということです。NSDictionaryまた、 のオブジェクトがであることもわかりますArraysよね? はい。したがって、Ordered Arrayより多くの配列があります。

dataNSDictionary の名前です。

したがって、あなたがしなければならないことは、それNSArray(あなたが常に望んでいたように順序付けられたもの) をこの .m ファイルに取り込み、その後、cellForRowAtIndexPathメソッドでいくつかの素晴らしいコードを使用することです。次のようにしてそれを行うことができます。

@interface yourViewController ()
{
    NSArray *yourArrayOrdered;
}
@end

@implementation yourViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    yourArrayOrdered = [[NSArray alloc] initWith...:... ];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    NSString *key = yourArrayOrdered[indexPath.row];
    NSArray *list = [self.data objectForKey:yourArrayOrdered[indexPath.row]];

    //your code continues here...

    /*id data = list[indexPath.row]; //don't think you need this line

    PSSearchCell *cell = [PSSearchCell newCellOrReuse:tableView];

    cell.model = data; */

    return cell;
}

NSDictionary と NSArray を使用して必要な順序を維持するために必要なことはこれだけです。

よりよく視覚化するために、順序付けられた配列に文字列のみが含まれている場合、次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath      *)indexPath
{
    NSString *key = yourArrayOrdered[indexPath.row];

    NSString *myString = [self.data objectForKey:yourArrayOrdered[indexPath.row]];

    cell.textLabel.text = [NSString stringWithFormat:@"THIS IS THE OBJECT %@", myString];

    cell.detailTextLabel.text = [NSString stringWithFormat:@"AND THIS IS THE KEY %@", key];

    return cell;
}

それが役に立てば幸い。

于 2014-03-15T00:44:49.677 に答える
0

ソース配列 (すべて順不同のオブジェクト) と参照配列 (目的の (そして完全に任意の) 順序のオブジェクトを含む) を取得し、ソース配列の項目が格納されている配列を返す簡単な方法を作成しました。参照配列に一致するように再編成されています。

- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray
{
    NSMutableArray *returnArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < [referenceArray count]; i++)
    {
        if ([sourceArray containsObject:[referenceArray objectAtIndex:i]])
        {
            [returnArray addObject:[arrReference objectAtIndex:i]];
        }
    }
    return [returnArray copy];
}

これは非常に壊れやすいことに注意してください。NSArrayのメソッドを使用しcontainsObject:、最終的には の を呼び出しNSObjectますisEqual:。基本的に、NSStrings、NSNumbers、およびおそらくNSDates (まだ試していません) の配列に対してはうまく機能するはずですが、それ以外では YMMV. s の配列やその他の非常に複雑なオブジェクトを渡そうとするとUITableViewCell、それ自体が完全に sh*t になり、クラッシュするか、総ガベージが返されると思います。NSDate同様に、参照配列として s の配列を渡しNSString、ソース配列として s の配列を渡すようなことをするとします。また、ソース配列に参照配列でカバーされていないアイテムが含まれている場合、それらは単に破棄されます。少し余分なコードを追加することで、これらの問題のいくつかに対処できます。

とは言っても、単純なことをしようとしているのであれば、うまくいくはずです。あなたの場合、arrayOne投稿した回答をソース配列およびarrayTwo参照配列として送信するだけです。

于 2013-12-17T20:41:45.543 に答える