0

我正在尝试从以下plist内容中读取

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
    <key>question</key>
    <string>2 + 2 = ?</string>
    <key>A</key>
    <string>2</string>
    <key>B</key>
    <string>4</string>
    <key>C</key>
    <string>3</string>
</dict>
<dict>
    <key>question</key>
    <string>2 + 4 = ?</string>
    <key>A</key>
    <string>3</string>
    <key>B</key>
    <string>6</string>
    <key>C</key>
    <string>9</string>
</dict>
</array>
</plist>

我试图在按下 UIButton 时更新视图控制器,但从数组中读取似乎有错误。有一个创建错误的数组。第一个问题显示得很好,但是当按下按钮时它会崩溃。断点显示崩溃的行是

self.questionasked.text = question[currentQuestion];

这是代码

- (void)viewDidLoad
{
[super viewDidLoad];
rootArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"question" ofType:@"plist"]];

currentQuestion = -1;
[self showNextQuestion];
}
 -(void) showNextQuestion{
        currentQuestion++;
    int numItems = [rootArray count];
    NSMutableArray *question = [NSMutableArray arrayWithCapacity:numItems];
    NSMutableArray *A = [NSMutableArray arrayWithCapacity:numItems];
    NSMutableArray *B = [NSMutableArray arrayWithCapacity:numItems];
    NSMutableArray *C = [NSMutableArray arrayWithCapacity:numItems]; 

for (NSDictionary *itemData in rootArray) {
    [question addObject:[itemData objectForKey:@"question"]];
    [A addObject:[itemData objectForKey:@"A"]];
    [B addObject:[itemData objectForKey:@"B"]];
    [C addObject:[itemData objectForKey:@"C"]];

    self.questionasked.text = question[currentQuestion];
    self.answer1.text = A[currentQuestion];
    self.answer2.text = B[currentQuestion];
    self.answer3.text = C[currentQuestion];

    }
}

-(IBAction)nextQ:(UIButton *) sender{

[self showNextQuestion];

 }
4

4 回答 4

0

首先,您需要更改将 plist 加载到数组中的方式,因为它会自动释放更改:

rootArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"question" ofType:@"plist"]];

有了这个 :

 rootArray = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"question" ofType:@"plist"]];

并且您遇到另一个将导致崩溃的错误,您必须在 showNextQuestion 方法中获取以下行:

self.questionasked.text = question[currentQuestion];
    self.answer1.text = A[currentQuestion];
    self.answer2.text = B[currentQuestion];
    self.answer3.text = C[currentQuestion];

在 for 语句中,代码应该是这样的:

-(void) showNextQuestion{
        currentQuestion++;
    int numItems = [rootArray count];
    NSMutableArray *question = [NSMutableArray arrayWithCapacity:numItems];
    NSMutableArray *A = [NSMutableArray arrayWithCapacity:numItems];
    NSMutableArray *B = [NSMutableArray arrayWithCapacity:numItems];
    NSMutableArray *C = [NSMutableArray arrayWithCapacity:numItems]; 

    for (NSDictionary *itemData in rootArray) {
        [question addObject:[itemData objectForKey:@"question"]];
        [A addObject:[itemData objectForKey:@"A"]];
        [B addObject:[itemData objectForKey:@"B"]];
        [C addObject:[itemData objectForKey:@"C"]];

        }
         self.questionasked.text = question[currentQuestion];
        self.answer1.text = A[currentQuestion];
        self.answer2.text = B[currentQuestion];
        self.answer3.text = C[currentQuestion];


    }

祝你好运..

于 2013-02-25T14:21:48.607 回答
0

请尝试将这些代码行放在for循环之外。

self.questionasked.text = question[currentQuestion];
self.answer1.text = A[currentQuestion];
self.answer2.text = B[currentQuestion];
self.answer3.text = C[currentQuestion];
于 2013-02-25T13:10:23.230 回答
0

当您使用:

rootArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"question" ofType:@"plist"]];

你会得到一个autoreleased NSArray,这就是它崩溃的原因,将其更改为:

rootArray = [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"question" ofType:@"plist"]] retain];

如果您使用的是 ARC,请使用:

@property (nonatomic, strong) NSArray *rootArray;

self.rootArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"question" ofType:@"plist"]];
于 2013-02-25T13:18:03.347 回答
0

首先从plist文件中获取数据,这里yourArrayNSArray

yourArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileName" ofType:@"plist"]];    

for(int i=0; i < yourArray.count; i++)
{
  NSLog(@"%@",[array objectAtIndex:i] objectForKey:@"question"]);
  NSLog(@"%@",[array objectAtIndex:i] objectForKey:@"A"]);
  NSLog(@"%@",[array objectAtIndex:i] objectForKey:@"B"]);
  NSLog(@"%@",[array objectAtIndex:i] objectForKey:@"C"]);
}

Consol 中的输出显示。

于 2013-02-25T13:08:22.587 回答