_NSCFString allKeys, нераспознанный селектор.Я думал, что это был NSDictionary? - PullRequest
0 голосов
/ 12 января 2012

Я схожу с ума, пытаясь понять, как реализовать tableView numberofRowsinSection, и надеялся, что смогу получить несколько советов или предложений.Я чувствую, что я слишком усложнил все это.Позвольте мне начать с публикации преобразованных данных XML, которые теперь являются NSDictionary.

{
    "@body" = "";
    "@class_id" = "";
    "@title" = Discussions;
    "@type" = "Discussion Block";
},
{
    "@body" = "";
    "@class_id" = "";
    "@col" = 1;
    "@title" = YouTube;
    "@type" = "Youtube Block";
    item =     {
        "@body" = "http://www.youtube.com/watch?v=vDWhfsQHq1o&ob=av3e";
        "@title" = "Gavin DeGraw - Not Over You";
        "@type" = link;
    };
},
{
    "@body" = "";
    "@class_id" = "";
    "@title" = Calendar;
    "@type" = "Calendar Block";
},
{
    "@body" = "<p>  homework test</p> ";
    "@class_id" = "";
    "@title" = Homework;
    "@type" = "File Block";
    item =     (
                {
            "@body" = "https://MYDOMAIN.com/securelink;
            "@title" = "crashreport.rtf";
            "@type" = file;
        },
                {
            "@body" = "mydomain.com/securelink";
            "@title" = "Chem notes sep 26.docx";
            "@type" = file;
    }
);
},
{
    "@body" = "<p>  Link testing</p> ";
    "@class_id" = "";
    "@title" = Links;
    "@type" = "Link Block";
    item =     (
                {
            "@body" = "http://google.com";
            "@title" = Link1;
            "@type" = link;
        },
                {
            "@body" = "http://yahoo.com";
            "@title" = link2;
            "@type" = link;
        },
                {
            "@body" = "http://reddit.com";
            "@title" = link3;
            "@type" = link;
        }
    );
}
)

Приведенные выше данные являются ответом.Цель этого состоит в том, чтобы первый ключ заголовка был заголовками таблицы, а второй ключ заголовка (внутри элемента) - строками соответствующих разделов.В методе tableView TitleforHeaderinSection я просто использую этот код

for (NSDictionary *roster in response) {
     [blockName addObject:[roster objectForKey@"@title"]];
 }
     return [blockName objectAtIndex:section];

В методе numberofRowsinSection все становится сложнее.Это то, что я пытался

for (NSDictionary *myDict in [[response objectAtIndex:section] valueForKeyPath:@"item"]) {
    NSArray *keys = [myDict allKeys];
    if ([keys containsObject:@"@title"]) {
        array3 = [[NSMutableArray alloc] init];
        [array3 addObject:[myDict objectForKey:@"@title"]];
    }
}
 return array3;

Ошибка, которую я получаю, состоит в том, что myDict является строкой NSString и все ключи не могут быть использованы на ней.Я не уверен, почему это происходит, потому что, когда я изменяю это на objectAtIndex: 1 и регистрирую это, метод allKeys работает.Я также почти уверен, что это не лучший способ найти количество строк, необходимое в каждом разделе, поэтому, если есть лучший способ, пожалуйста, поделитесь.

Просто чтобы уточнить, это то, что яищу в моем tableView после анализа приведенных выше данных:

 Header (Discussions)
   -No rows under this header
 Header (YouTube)
   -Row (Gavin DeGraw - Not Over You)
 Header (Calendar)
   -No rows
 Header (Homework)
   -Row (crashreport)
   -Row (chem notes)
 Header (links)
   -Row (link1)
   -Row (link2)
   -Row (link3)

Спасибо за вашу помощь.Я провел очень много исследований по методам NSDictionary и NSArray, но я не уверен, как решить эту проблему или как-то иначе ее кодировать.

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Предположим, что если ключ "item" существует, то соответствующий объект является NSArray элементов.

Try:

NSArray *items = [[response objectAtIndex:section] valueForKey:@"item"];

if (items!=nil) {
    return [items count];
} else {
    return 0;
}
0 голосов
/ 12 января 2012

Проблема здесь:

для (NSDictionary * myDict в [[response objectAtIndex: section] valueForKeyPath: @ "item"]) {

Это хорошо для словаря ниже, потому что он перебирает NSArray объектов NSDictionary. Поэтому, когда вызывается [myDict allKeys], вы фактически вызываете его в NSDictionary.

{
    "@body" = "<p>  homework test</p> ";
    "@class_id" = "";
    "@title" = Homework;
    "@type" = "File Block";
    item =     (
                {
            "@body" = "https://MYDOMAIN.com/securelink;
            "@title" = "crashreport.rtf";
            "@type" = file;
        },
                {
            "@body" = "mydomain.com/securelink";
            "@title" = "Chem notes sep 26.docx";
            "@type" = file;
    }
);

Но это нехорошо для следующего словаря, потому что вы перебираете словарь вместо массива, поэтому цикл for..in зацикливает ключи словаря. Затем вы вызываете allKeys для строки NSSt (также как ключ в словаре).

{
    "@body" = "";
    "@class_id" = "";
    "@col" = 1;
    "@title" = YouTube;
    "@type" = "Youtube Block";
    item =     {
        "@body" = "http://www.youtube.com/watch?v=vDWhfsQHq1o&ob=av3e";
        "@title" = "Gavin DeGraw - Not Over You";
        "@type" = link;
    };
},

Вместо этого вы можете сделать что-то вроде этого:

id item = [[response objectAtIndex:section] valueForKeyPath:@"item"];
if(item) {
    if([item isKindOfClass:[NSDictionary class]]) {
        NSArray *keys = [(NSDictionary *)item allKeys];
    } else if([item isKindOfClass:[NSArray class]]) {
        for (NSDictionary *myDict in (NSArray *)item) {
            NSArray *keys = [myDict allKeys];
        }
    }
}
else {
  return 0;
}
...