2013-07-19 30 views
9

Tôi cần hiển thị trong một UITableView nội dung của một NSDictionary được trả về bởi một API, tôn trọng thứ tự của các phím.NSDictionary allKeys order

Tôi đang sử dụng:

- (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; 
} 

nhưng như tôi làm self.data.allKeys, tôi mất trật tự của chìa khóa của tôi. Tôi không thể sắp xếp chúng theo giá trị vì nó không liên quan đến chúng.

+1

Những khóa đó không bao giờ được đặt hàng. Từ điển không có thứ tự. –

+0

có thể trùng lặp của [Làm thế nào tôi có thể nhận được thứ tự Ban đầu của NSDictionary/NSMutableDictionary?] (Http://stackoverflow.com/questions/3386921/how-can-i-get-original-order-of-nsdictionary-nsmutabledictionary) – Amar

Trả lời

1

Như mọi người đều biết, tôi không thể đặt chìa khóa của tôi như chúng xuất hiện trong nhật ký của tôi NSDictionary vì một NSDictionary không được đặt hàng.

Tôi hỏi những người từ API để trả lại một mảng thay vì:

0 => name : key 1 
    value : value 1 

1 => name : key 2 
    value : value 2 

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

Quá xấu không có một phương pháp "sortedArrayUsingArray" được sử dụng như thế:

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]; 
+0

Không tồn tại phương thức như vậy: "sortedArrayUsingArray". Sử dụng: http://blog.pioneeringsoftware.co.uk/2008/08/20/sorting-an-array-by-another-array/ –

23

Hãy thử điều này,

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

NSLog(@"%@",keys); 

Bây giờ lấy giá trị dựa trên phím được sắp xếp.

EDIT

Để sắp xếp chúng theo thứ tự chữ cái cố gắng này,

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

NSLog(@"%@",keys); 
+0

Nhưng Tôi không có những thứ như "Foo1", "Foo2" ... Tôi không có bất kỳ số nào trong tên chính của mình. API của tôi trả về khóa = "Cinema" value = danh sách rạp chiếu phim, key = "Theatre", value = list of theater và tôi cần hiển thị chúng theo thứ tự đó: Rạp chiếu phim trước, sau đó là rạp chiếu phim. –

+0

@NicolasRoy Vui lòng kiểm tra câu trả lời cập nhật. –

+0

@ βhargavḯ Tôi không muốn sắp xếp các khóa này nơi tôi muốn nhận chìa khóa mà không cần thay đổi thứ tự. Vì vậy, nó có thể? Hãy giúp tôi. –

0

tôi đã viết một phương pháp nhanh chóng để mất một mảng nguồn (của đối tượng s tất cả không đúng thứ tự) và một mảng tham chiếu (có các đối tượng theo thứ tự mong muốn (và hoàn toàn tùy ý), và trả về một mảng trong đó các mục của mảng nguồn đã được sắp xếp lại để phù hợp với mảng tham chiếu.

- (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]; 
} 

Lưu ý rằng điều này rất mong manh. Nó sử dụng phương thức containsObject: của NSArray, cuối cùng sẽ gọi NSObject's isEqual:. Về cơ bản, nó sẽ hoạt động tốt đối với các mảng NSString s, NSNumber s và có thể là NSDate s (chưa thử), nhưng bên ngoài đó, YMMV. Tôi tưởng tượng nếu bạn cố gắng vượt qua mảng UITableViewCell s hoặc một số đối tượng thực sự phức tạp khác, nó sẽ hoàn toàn sh * t chính nó, và một trong hai tai nạn hoặc trả lại tổng số rác. Tương tự như vậy nếu bạn đã làm một cái gì đó như vượt qua một mảng của NSDate s làm mảng tham chiếu và một mảng của NSString s làm mảng nguồn. Ngoài ra, nếu mảng nguồn chứa các mục không nằm trong mảng tham chiếu, chúng sẽ bị loại bỏ. Người ta có thể giải quyết một số vấn đề này bằng cách thêm một chút mã.

Tất cả những gì đã nói, nếu bạn đang cố gắng làm điều gì đó đơn giản, nó sẽ hoạt động tốt. Trong trường hợp của bạn, bạn chỉ cần gửi arrayOne từ câu trả lời bạn đã đăng dưới dạng mảng nguồn và arrayTwo làm mảng tham chiếu.

0

Bạn nói rằng bạn đã mất thứ tự các khóa, vì vậy tôi cho rằng bạn lấy các khóa đó từ một số NSArray. Đúng? Và trong đó NSArray bạn có các phím được đặt hàng theo ý muốn. Và tôi cũng thấy rằng các đối tượng của NSDictionaryArrays, phải không? Vâng.Vì vậy, trong số Ordered Array bạn có nhiều mảng hơn.

data là tên của từ điển NSDictionary.

Vì vậy, tất cả những gì bạn phải làm là mang lại NSArray (thứ được đặt hàng như bạn luôn muốn) vào tệp .m này và sau đó sử dụng một số mã tuyệt vời trong phương thức cellForRowAtIndexPath của bạn. Bạn có thể làm điều đó bằng cách thực hiện như sau:

@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; 
} 

Và đây là tất cả những gì bạn phải làm để giữ thứ tự bạn muốn bằng NSDictionary và NSArray.

Để hình dung nó tốt hơn, trong trường hợp đó mảng lệnh của bạn chỉ chứa chuỗi nó sẽ là như thế này:

- (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; 
} 

Hy vọng nó giúp.