从NSMutableDictionary按顺序创建UITableCell单元格

时间:2012-11-29 16:19:49

标签: ios cocoa-touch uitableview nsmutabledictionary

我有一个从JSON查询创建的NSMutableDictionary,在浏览器中运行json查询,输出按字母顺序排列,我需要它,并使用NSLOG以正确的顺序显示它验证这一点。但是,当我填充UITableView单元格时,订单完全不同,但我希望保留原始订单。

我理解字典不是为了排序而设计的,我可以映射到一个新的排序数组但是如果我这样做(如果这是实现这个的正确方法?),目前还不清楚如何解决正确的键和索引细节视图。有什么想法吗?感谢。

创建JSON数据和创建表格单元格的代码如下:

- (void) makeData {
    //Define dictionary
    fullDictionary = [[NSMutableDictionary alloc] init];

    //parse JSON data from a URL into an NSArray
    NSString *urlString = [NSString stringWithFormat:@"http://<JSON feed goes here>"];
    NSURL *url = [NSURL URLWithString:urlString];
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSError *error;
    fullDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // cell data - extracting the appropriate values by object rows
    cell.textLabel.text = [[[fullDictionary allValues] valueForKeyPath:@"strTerm"] objectAtIndex:indexPath.row];

    return cell;
}

1 个答案:

答案 0 :(得分:1)

从您的代码判断,看起来您知道如何从字典中获取相应的数组,因为您显然正在使用数组来设置cell.textLabel的当前值。因此对代码进行逆向工程,看起来像未排序的数组是由:

决定的
NSArray *originalArray = [[fullDictionary allValues] valueForKeyPath:@"strTerm"];

现在您只需要对该数组进行排序。如果它是一个简单的字符串数组,你可以做一些简单的事情:

NSArray *sortedArray = [originalArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

如果您正在处理更复杂的字典条目数组或类似的东西,那么排序方法的排列可以让您获得很好的控制。请参阅此处以获取更复杂的排序方法,作为对JSON结果进行排序的方法:Filtering UITableView from XML source。这是一个与你不同的问题,但也许它可以让你了解你可以用sortedArrayUsingComparator做些什么。