Как получить значения без использования ключа из NSDictionary / NSMutableDictionary в iPhone? - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть ответ веб-службы в формате Json (метод Key and Value). Я разобрался и получил максимум методов веб-сервиса. Но в одном методе веб-сервиса я не могу получить значения из ключа. Здесь я прилагаю образец ответа,

lessons =     (
                {  
            "ObjectiveC Book" =             (
                                {
                    "brief_desc" = "ObjectiveC";
                    cost = 20;
                    date = "2011-09-06";
                },
                                {
                    "brief_desc" = "ObjectiveC";
                    cost = 20;
                    date = "2011-09-07";
                },
                                {
                    "brief_desc" = "ObjectiveC";
                    cost = 20;
                    date = "2011-09-09";
                },
                                {
                    "brief_desc" = "ObjectiveC";
                    cost = 20;
                    date = "2011-09-10";
                },
                                {
                    "brief_desc" = "ObjectiveC";
                    cost = 20;
                    date = "2011-09-14";
                }
            );
        }
    );

У меня есть значение для ключевых уроков, значение:

{  
                "ObjectiveC Book" =             (
                                    {
                        "brief_desc" = "ObjectiveC";
                        cost = 20;
                        date = "2011-09-06";
                    },
                                    {
                        "brief_desc" = "ObjectiveC";
                        cost = 20;
                        date = "2011-09-07";
                    },
                                    {
                        "brief_desc" = "ObjectiveC";
                        cost = 20;
                        date = "2011-09-09";
                    },
                                    {
                        "brief_desc" = "ObjectiveC";
                        cost = 20;
                        date = "2011-09-10";
                    },
                                    {
                        "brief_desc" = "ObjectiveC";
                        cost = 20;
                        date = "2011-09-14";
                    }
                );
            }

Теперь мне нужно получить значения для ключей date, cost иrief_desc. Над значениями находятся в NSDictionary. Итак, я использовал этот код, чтобы получить значения для контрольной даты, стоимости и bried_desc.

 NSDictionary *lessonDic = [[NSDictionary alloc] init];
    lessonDic = [latestLoans valueForKey:@"lessons"];
    NSLog(@"LessonsDic : %@", lessonDic);

    NSMutableDictionary *BookDic = [[NSMutableDictionary alloc] init];
    BookDic = [lessonDic valueForKey:@"ObjectiveC Book"];
    NSLog(@"StudentDic : %@, Count : %d", BookDic, [BookDic count]);

    NSArray *sDateArray = [BookDic valueForKey:@"date"];
    NSLog(@"sDateArray : %@", sDateArray);

В NSlog я получил значения в методе словаря. значения и количество sDateArray:

(
        "2011-09-06",
        "2011-09-07",
        "2011-09-09",
        "2011-09-10",
        "2011-09-14"
    )
count : 1

Как я могу разобрать и получить точные значения для ключевой даты, краткого описания и стоимости? Мне нужно загрузить эти элементы в UITableView. Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 25 ноября 2011

Спасибо всем моим друзьям, которые просмотрели мой вопрос и ответили мне. Я решил эту проблему с этим кодом. Моя особая благодарность г-ну Маттиасу Вадману, г-ну Адедой и г-ну Иноту.

NSArray *items = [lessonDicti valueForKeyPath:@"ObjectiveC Book"];
NSLog(@"Items : %@, Count  :%d", items, [items count]);
NSEnumerator *enumerator = [items objectEnumerator];
NSDictionary* item;
while (item = (NSDictionary*)[enumerator nextObject]) 
{
    NSLog(@"Item Dict : %@", item);
    sDateArray = [item valueForKey:@"date"];
    NSLog(@"sDateArray : %@", sDateArray);
    descArray = [item valueForKey:@"brief_desc"];
    cstArray = [item valueForKey:@"cost"];
    NSLog(@"eventStatusArray : %@, Count : %d", cstArray, [cstArray count]);
}

Этот код решил мою проблему. Спасибо.

0 голосов
/ 25 ноября 2011

вы можете использовать allKeys и allValues ​​ методы

, если вы хотите отсортировать ключи по имени, вы можете использовать следующий пример

static NSInteger alphabeticSortByLabelInDictionary_pad(NSDictionary *dict1, NSDictionary *dict2, void *reverse) {
    NSString *label1 = [dict1 objectForKey:@"Label"];
    NSString *label2 = [dict2 objectForKey:@"Label"];

    if (*(BOOL *)reverse == YES) {  
        return [label2 localizedCaseInsensitiveCompare:label1];
    }
    return [label1 localizedCaseInsensitiveCompare:label2];
}

FilterListContent- NSArray

Пример использования:

BOOL reverseSort = NO;
    list = [filteredListContent sortedArrayUsingFunction:alphabeticSortByLabelInDictionary_pad context:&reverseSort];
0 голосов
/ 25 ноября 2011

Я думаю, вы должны использовать массив, составленный из словаря, например:

//in you .h 
NSArray objectiveBook

Тогда вы инициализируете его в себе .m и получаете json. Что-то вроде:

objectiveBook = [lessonDic valueForKey:@"ObjectiveC Book"];

Так что вы можете использовать его размер в tableView

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [objectiveBook count];  }

А также в настройке внешнего вида ячеек табличного представления.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"cell";

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//blah blah..

    NSDictionary *temp = [objectiveBook objectAtIndex:indexPath.row];

    UILabel *lbl1 = [[UILabel alloc] initWithFrame:CGRectMake(90, 0, 170, 60)];
    //initialize other labels here...

//gets the values you want
lbl1.text = [temp objectForKey:@"brief_desc"];
lbl2.text = [temp objectForKey:@"cost"];
lbl3.text = [temp objectForKey:@"date"];
//display it
[cell.contentView addSubview:lbl1];
[cell.contentView addSubview:lbl2];
[cell.contentView addSubview:lbl3];

return cell; }

Вот, пожалуйста. Я предполагаю, что вы уже установили uitableview в своем пике.

0 голосов
/ 25 ноября 2011

Я думаю, что вы используете valueForKey на NSArray, который, по вашему мнению, NSMutableDictionary. Результатом будет то, что valueForKey отправляется всем элементам в массиве, возвращается новый массив со значениями.

[lessonDic valueForKey:@"ObjectiveC Book"]; - это массив, а не словарь.

Кстати, вам не нужно делать alloc / init для lessonDic и BookDic перед их использованием. Вероятно, вам следует немного прочитать об управлении памятью в Objective-C и Cocoa.

...