11

我需要在 UITableView 中显示 API 返回的 NSDictionary 的内容,同时尊重键的顺序。

我正在使用 :

- (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 *) 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'sisEqual:。基本上,它应该适用于NSStrings、NSNumbers 和可能NSDates 的数组(还没有尝试过),但除此之外,YMMV。我想如果你试图传递UITableViewCells 的数组或其他一些非常复杂的对象,它会完全 sh*t 本身,要么崩溃,要么返回全部垃圾。同样,如果您要执行类似传递NSDates 数组作为参考数组和NSStrings 数组作为源数组的操作。此外,如果源数组包含参考数组中未涵盖的项目,它们将被丢弃。可以通过添加一些额外的代码来解决其中一些问题。

综上所述,如果您尝试做一些简单的事情,它应该可以很好地工作。在您的情况下,您只需arrayOne从作为源数组和arrayTwo参考数组发布的答案发送。

于 2013-12-17T20:41:45.543 回答
0

您说您丢失了键的顺序,所以我想您从NSArray. 对?并且NSArray您可以根据需要订购钥匙。而且我还看到NSDictionaryare的对象Arrays,对吗?是的。所以在你的Ordered Array你有更多的数组。

data是 NSDictionary 的名称。

所以,你所要做的就是把它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 回答