2013-02-25 3 views
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> 

Я пытаюсь обновить View Controller, когда 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]; 

} 
+1

Пожалуйста, пост символическую StackTrace. – trojanfoe

+0

где это? как я его получу – Sfocker

+0

Запустите приложение в отладчике, дождитесь его сбой и вы сможете использовать 'bt' в окне отладчика, чтобы получить обратную трассировку. – trojanfoe

ответ

0

Пожалуйста, попробуйте поместить эти строки кода вне вашей петли for.

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

Спасибо миллиону HRM, который сделал трюк – Sfocker

0

Сначала получить данные из файла plist, здесь yourArray является NSArray

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.

0

При использовании:

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

Вы получите autoreleasedNSArray, поэтому он выходит из строя, изменить что:

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"]]; 
+0

Я использую ARC .... когда я запускал проект, он дал мне ошибку использования незаявленного идентификатора «_rootArray», вы имели в виду «rootArray»? – Sfocker

+0

@Sfocker: моя ошибка, отредактировано –

+0

У меня проблема исправлена ​​без использования этого метода, но мне любопытно, что это значит для моего проекта? – Sfocker

0

первую очередь вам необходимо изменить способ загрузить PLIST в массив, потому что он будет autoreleased изменить:

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

из ряда для предложения код должен быть таким:

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


    } 

удачи ..

Смежные вопросы