【问题标题】:iPhone SDK NSDictionary and NSArray confusioniPhone SDK NSDictionary 和 NSArray 混淆
【发布时间】:2009-12-24 23:29:30
【问题描述】:

我一直在努力让它工作大约三天,并让我思考它。有人可以建议。 我已经建立了基础,它们都很好用,但是当我尝试做额外的一点时,我无法理解它。 我正在尝试从 plist 构建技术术语表。这是一个按字母表索引和部分的表。 这很好用,但是当我尝试在新的视图控制器中为每个术语的定义添加下一个级别时,我似乎无法正确获取代码或 plist 结构。 目前我已经创建了两个 plist。一个包含 26 个数组的字母字典,每个数组中包含一系列技术术语。这一切都很好。 然后我创建了另一个定义列表作为字典数组,每个单词/定义对都有一个。我期望将 @"word" 键从视图控制器传递给 detailviewcontroller,然后获取 @"definition"。我不知道这是对还是错(?) 我的代码显示了技术术语表很棒,但选择一行时它会崩溃。我知道这与传递 detailviewcontroller 引用的代码有关,因此 detailview 可以获取定义 - 但我不知道如何解决它。我已经在这里发布了我的部分代码,以便有人寻求帮助。有什么想法吗?

NSString *wordPath = [[NSBundle mainBundle] pathForResource:@"newsortedglossary" ofType:@"plist"];
NSDictionary *wordDict = [[NSDictionary alloc] initWithContentsOfFile:wordPath];
self.words = wordDict;
[words release];
NSArray *wordArray = [[words allKeys] sortedArrayUsingSelector:@selector(compare:)];
self.wordKeys = wordArray;

NSString *definitionPath = [[NSBundle mainBundle] pathForResource:@"newnewdefinitionglossary" ofType:@"plist"];
NSDictionary *definitionDict = [[NSDictionary alloc] initWithContentsOfFile:definitionPath];
self.definitions = definitionDict;
[definitions release];

didSelectRow 在这里.........

GlossaryDetailViewController *glossaryDetailViewController = [[GlossaryDetailViewController alloc]
                                                              initWithNibName:@"GlossaryDetailView" bundle:nil];

NSLog(@"did select-2"); // CRASHES HERE with NSDictionary may not respond to objectAtIndex
glossaryDetailViewController.definition = [self.words objectAtIndex:indexPath.row];
NSLog(@"did select-3");
[self.navigationController pushViewController:glossaryDetailViewController animated:YES];
NSLog(@"did select-4");
[glossaryDetailViewController release];

detailViewController 这里.......

- (void)viewDidAppear:(BOOL)animated {
NSLog(@"didappear");
self.glossaryWordDefinition.text = [definition objectForKey:@"definition"];

【问题讨论】:

    标签: iphone sdk nsarray plist nsdictionary


    【解决方案1】:

    您似乎正在尝试使用索引来访问字典的成员,而不是使用键来查找关联的值。

    在你的 didSelectRow 中你可能想要这个:

    glossaryDetailViewController.definition = [self.wordKeys objectAtIndex:indexPath.row];
    

    不同之处在于,现在您正在尝试使用索引访问数组的成员。

    【讨论】:

    • 非常感谢。我相信你是对的。我已经对其进行了更改,现在代码将处理到详细控制器。但后来我认为它在代码中崩溃了.. NSLog(@"Glossary detail viewDidLoad start"); self.navigationItem.title = [定义 objectForKey:@"word"]; [超级 viewDidLoad];
    • 好的,所以我猜您正在尝试获取键的定义,即该数组条目的“单词”。我认为您可能对字典与数组的概念有点不清楚。 NSArrays 是一个对象列表,通常每个数组不止一个项目。 NSDictionaries 是一对键和它们的关联值。钥匙将是独一无二的。例如,整个字典中只有一个 key="word"。看起来您可能认为每个索引都有一个“单词”键,这告诉我您可能将数组误认为是字典。
    • 一个数组可以有无限数量的字典作为它的条目。一旦你将一个对象从数组传递到你的细节控制器,你就可以在那个条目中查找 key="word"。但是您在上面加载字典的方式看起来不像那种用法。您可能希望像这样加载您的数组: NSArray tempArray = [[NSArray alloc] initWithContentsOfFile: wordPath];现在,您使用 objectAtIndex: 得到的每个条目都将成为一个独立的字典,您可以根据需要提取密钥对。这是我能用你提供的代码做的最好的事情。
    • 祝您节日快乐!你的解释帮助了我两件事。首先,解决我的问题,其次,更好地理解数组和字典。我现在已经将定义数据更改为一个数组,然后将其完美地读入我的细节控制器。谢谢。
    • 持有它。定义现在确实出现在详细视图中,但似乎仅限于“部分”。如果我选​​择“B”部分中的第二个术语,它会显示“A”部分的第二个术语定义的定义。这发生在所有部分 - 一切都出现了字母 A 的术语定义。显然我应该告诉它哪个部分?但是如何?
    猜你喜欢
    • 2013-03-10
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多