【问题标题】:Reading dictionary and child dictionary from plist从 plist 中读取字典和子字典
【发布时间】:2014-02-21 16:02:24
【问题描述】:

我创建了一个如下所示的 plist 文件:


从中可以将所有 plist 信息提取到 NSArray 中:

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

并使用此数组加载 TopicTitle 的 tableview:

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

选择表中的行时,我将名为“问题”的字典传递给如此如下所示的下一个视图控制器:

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

从这里我想遍历每个“问题”字典,并通过执行以下操作将“问题文本”和“答案一/二...”字符串加载到对象数组中:

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,以便我仍然能够访问“问题文本”和“答案一/二...”节点?

或者有没有更好的方法来读取字符串而不循环遍历每个“问题”字典?

【问题讨论】:

  • 在您的屏幕截图中,ques 对象是一个字符串,而不是字典。所以里面没有4个项目。我认为您正在不正确地遍历 plist。
  • 我不知道为什么 ques 对象是一个字符串,正如您在 for 循环中看到的那样,它被声明为字典,我不遍历 plist - 我把它放入直接来自文件的主题数组
  • 在局部变量中,无论你声明一个变量是什么,它都会显示它实际上是什么。我可以将一个 NSString 对象声明为一个 UIView,但这并不能成为一个。
  • 好的,所以它必须是一个字符串,因为它只包含字典的值('Question','Question - 2','Question - 3','Question - 4')而不是子元素(QuestionText 和 Answer),我该如何传递“问题”字典,以便保留 4 个子“问题”字典中的每一个的所有元素?
  • 将对valueForKey: 的调用替换为对objectForKey: 的调用。这有帮助吗?除非您真的想使用键值编码,否则不应使用 valueForKey:

标签: ios dictionary ios7 uitableview plist


【解决方案1】:

我认为您没有正确获取问题字典。在您的屏幕截图中,ques 对象是 NSString 对象,而不是 NSDictionary。所以在NSString 对象ques 上获取objectForKey 是行不通的(而且真的应该让你的应用崩溃)。

试试这个 for 循环:

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

【讨论】:

  • 你应该使用objectForKey:。仅当您确实需要使用键值编码功能时才使用valueForKey:
  • 感谢 Putz,这与使用 objectForKey 获取原始“问题”字典一起使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多