2010-10-05 54 views
1

我有一个plist类型的字典,其中包含数组类型的键的plist,每个数组都有三个字符串类型的项。在plist中访问数组中的字符串iphone

我想访问字符串并将它们传递给视图控制器。

此行是成功的在我的cellForRowAtIndexPath

NSLog(@"Strings from plist: %@", [[self.aDictionary objectForKey:(@"%@",[self.keys objectAtIndex:row])] objectAtIndex:0]);

当我把在同一行中我didSelectRowAtIndexPath方法方法我得到一个BAD_ACCESS错误。

任何有关如何获取字符串的建议将会有所帮助。

这里是我的.plist

<dict> 
    <key>Derivative</key> 
    <array> 
     <string>Derivative 1</string> 
     <string>front.png</string> 
     <string>back.png</string> 
    </array> 
    <key>Rolle&apos;s Theorem</key> 
    <array> 
     <string>Rolle&apos;s Theorem 1</string> 
     <string>front.png</string> 
     <string>3bk.png</string> 
    </array> 
    <key>Chain Rule</key> 
    <array> 
     <string>Chain Rule</string> 
     <string>chainrule1.png</string> 
     <string>chainrule1_bk.png</string> 
    </array> 
</dict> 
</plist> 

而且这里有两种方法:

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 


    NSUInteger row = [indexPath row]; 

    cell.backgroundColor = [UIColor purpleColor]; 
    cell.textLabel.textColor = [UIColor blackColor]; 

    cell.textLabel.text = [self.keys objectAtIndex:row]; 

    // Key output to NSLOG accessing elements from the plist 
    NSLog(@"Strings from plist: %@", [[self.aDictionary objectForKey:(@"%@",[self.keys objectAtIndex:row])] objectAtIndex:0]); 

    cell.textLabel.font = [UIFont fontWithName:@"Verdana-Bold" size:18.0]; 
    cell.textLabel.numberOfLines = 2; 
    cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TableCell_BG.png"]] autorelease]; 

    return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSUInteger row = [indexPath row]; 
    NSLog(@"Row selected was: %i", row); 

    // Key output to NSLOG accessing elements from the plist 
    //NSLog(@"Strings from plist: %@", [[self.aDictionary objectForKey:(@"%@",[self.keys objectAtIndex:row])] objectAtIndex:0]); 


/* 
    NSString *selectedCard = [[aDictionary objectForKey:(@"%@",[keys objectAtIndex:row])] objectAtIndex:0]; 
    NSLog(@"Showing Flash Card: %@", selectedCard); 
*/ 

    FlashCardViewController *flashVC = [[FlashCardViewController alloc] initWithNibName:@"FlashCardViewController" bundle:nil]; 

    id aKey = [keys objectAtIndex:row]; 

    flashVC.aSelectedCard = [[aDictionary objectForKey:aKey] objectAtIndex:0]; 

    [self.navigationController pushViewController:flashVC animated:YES]; 
    [flashVC release]; 

} 
+0

您正在错误地访问indexPath的行变量。看看我的posst,它会告诉你如何摆脱EXC_BAD_ACCESS错误 – Pavan 2010-10-05 02:18:56

+0

NSUInteger row = [indexPath row]; 不应该工作它应该是NSUInteger row = indexPath.row;这是有效的,应该摆脱错误。我只是自己试过,我没有得到任何错误 – Pavan 2010-10-05 03:07:15

回答

1

我的猜测是,你是不是保留aDictionarykeys,或者你有其他的内存问题是体现在代码中的那一点。但是如果没有其他代码就很难说清楚。

+0

在我的头文件中,我声明了这样的变量: – Nungster 2010-10-05 02:56:37

+0

@property(nonatomic,retain)NSDictionary * aDictionary; @property(nonatomic,retain)NSMutableArray * keys; 这足以保留变量吗? – Nungster 2010-10-05 02:57:22

+0

取决于你如何构造它们:aDictionary = [NSDictionary dictionaryWithContentsOfFile:path]是不够的。 – Aleph7 2010-10-05 04:47:48

0

改变这一行到

flashVC.aSelectedCard = [[aDictionary objectForKey:[键objectAtIndex:行]] objectAtIndex:0];

程序崩溃在哪里,哪一行?

+0

如图所示,程序不会崩溃,但不会从plist中拉出字符串。如果我取消注释第二行,我打印到NSLog“来自plist的字符串”这会使其崩溃。但是在它之前的方法中,对NSLog的相同调用将正常运行,并在控制台中显示字符串。我现在不在我的Mac,但会尝试你的电话,看看它是否呈现我期望实现的目标。 – Nungster 2010-10-05 14:07:42

+0

在帖子中,您声明了Bad Access。在哪一行? – Jordan 2010-10-05 14:28:45

+0

我试过这一行,并且仍然像以前一样在此行获得EXC_BAD_ACCESS。 :( – Nungster 2010-10-05 21:39:03