Хобрук: Ваш путь к мастерству в программировании

Чтение словаря и дочернего словаря из plist

Я создал файл plist, который выглядит так:

введите описание изображения здесь
Из этого я могу извлечь всю информацию о plist в NSArray:

-(NSArray *)Topics
{
    if(!_Topics)
    {
        _Topics = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"TopicData" ofType:@"plist"]];
    }
    return _Topics;
}

И используйте этот массив для загрузки таблицы TopicTitle:

cell.textLabel.text = [[self.Topics objectAtIndex:indexPath.row] valueForKey:@"TopicTitle"];

Когда строка в таблице выбрана, я передаю словарь с именем «Вопросы» следующему ViewController следующим образом:

NSDictionary *questions = [[self.Topics objectAtIndex:indexPath.row] valueForKey:@"Questions"];
[self.detailViewController setQuestions:(questions)];

Отсюда я хочу перебрать каждый словарь «Вопрос» и загрузить строки «QuestionText» и «AnswerOne/Two...» в массив объектов, выполнив что-то вроде этого:

TopicQuestions = [NSMutableArray array];
for(NSDictionary *ques in self.Questions)
{
    Question* q = [[Question alloc] init];
    q.Question = (NSString*)[ques objectForKey:@"QuestionText"];
    q.AnswerOne = (NSString*)[ques objectForKey:@"QuestionText"];
    q.AnswerTwo = (NSString*)[ques objectForKey:@"QuestionText"];
    q.AnswerThree = (NSString*)[ques objectForKey:@"QuestionText"];
    q.AnswerFour = (NSString*)[ques objectForKey:@"QuestionText"];
    [TopicQuestions addObject:q];
}

Но словарь «Вопросы», похоже, не имеет этих данных, он знает, что есть 4 дочерних объекта, но не имеет всех значений пары ключей этих объектов:

введите здесь описание изображения

Итак, мой вопрос заключается в том, как мне передать словарь «Вопросы» следующему ViewController, чтобы я по-прежнему мог получить доступ к узлам «QuestionText» и «AnswerOne/Two...»?

Или есть лучший способ чтения строк без перебора каждого словаря «Вопрос»?


  • На вашем снимке экрана объект ques представляет собой строку, а не словарь. Так что внутри него не 4 предмета. Я думаю, что вы неправильно перебираете plist. 29.01.2014
  • Я не знаю, почему объект ques является строкой, как вы можете видеть в цикле for, он объявлен как Dictionary, я не перебираю plist - я помещаю его в массив Topics прямо из файла 29.01.2014
  • В локальных переменных не имеет значения, как вы объявляете переменную, она покажет, что она есть на самом деле. Я могу объявить объект NSString как UIView, но это не делает его таковым. 29.01.2014
  • Итак, это должна быть строка, потому что она содержит только значение словаря («Вопрос», «Вопрос — 2», «Вопрос — 3», «Вопрос — 4»), а не дочерние элементы (QuestionText и Answer) , как мне передать словарь «Вопросы», чтобы он сохранил все элементы каждого из 4 дочерних словарей «Вопрос»? 29.01.2014
  • Замените вызов valueForKey: вызовом objectForKey:. Это помогает? Вы не должны использовать valueForKey:, если вы действительно не хотите использовать кодирование ключ-значение. 29.01.2014
  • @JamClerk Вы смотрели мой ответ? Там показано, как именно ответить на ваш последний вопрос... 29.01.2014
  • попытался изменить его на ObjectForKey: NSDictionary *questions = [[self.Topics objectAtIndex:indexPath.row] valueForKey:@Questions]; но это не сработало, ques все еще строка 29.01.2014
  • @JamClerk Посмотрите на первую строку моего ответа внутри цикла for. Это ваш ответ. 29.01.2014

Ответы:


1

Я не думаю, что вы правильно понимаете словарь вопросов. На вашем снимке экрана объект ques является объектом NSString, а не NSDictionary. Таким образом, получение objectForKey для объекта NSString ques не сработает (и действительно должно привести к сбою вашего приложения).

Попробуйте это для цикла:

for(NSString *ques in self.Questions)
{
    NSDictionary *dict = [self.questions objectForKey:ques];
    Question* q = [[Question alloc] init];
    q.Question = (NSString*)[dict objectForKey:@"QuestionText"];
    q.AnswerOne = (NSString*)[dict objectForKey:@"QuestionText"];
    q.AnswerTwo = (NSString*)[dict objectForKey:@"QuestionText"];
    q.AnswerThree = (NSString*)[dict objectForKey:@"QuestionText"];
    q.AnswerFour = (NSString*)[dict objectForKey:@"QuestionText"];
    [TopicQuestions addObject:q];
}
29.01.2014
  • Вы должны использовать objectForKey:. Используйте valueForKey: только тогда, когда вам действительно нужно использовать функции кодирования ключ-значение. 29.01.2014
  • спасибо Putz, это сработало вместе с использованием objectForKey для получения исходного словаря «вопросов». 29.01.2014
  • Новые материалы

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

    Это все, что вам нужно знать о Kotlin в 2022 году
    Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

    Текстовый графический интерфейс с Lanterna на Java
    Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

    Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
    Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

    Основы C# — Нулевой оператор объединения (??)
    Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

    Сравнение номеров версий в C++ с использованием синтаксического анализа строк
    Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

    В мир искусственного интеллекта…
    ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..