2012-11-21 1 views
1

J'essaie d'enregistrer des données lorsque le bouton d'accueil est enfoncé. Voici mon code pertinent.'NSRangeException' lors de la lecture des données d'un fichier

- (NSString *) saveFilePath 
{ 
    NSArray *path = 
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    return [[path objectAtIndex:0] stringByAppendingPathComponent:@"savefile.plist"]; 

} 
- (void)applicationDidEnterBackground:(UIApplication *)application { 
    NSArray *values = [[NSArray alloc] initWithObjects: 
        [NSNumber numberWithInt:askedQuestions], //for questionLabel 
        [NSNumber numberWithInt:timeMin],   //timeMin 
        [NSNumber numberWithInt:timeSec],   //timeSec 
        [NSNumber numberWithInt:skipCount],  //skipped question 
        [NSNumber numberWithInt:correctAnswers], //corectAnswers 
        nil]; 
[values writeToFile:[self saveFilePath] atomically:YES]; 
} 

La méthode saveFilePath fournit le chemin du fichier.

Et viewDidLoad

NSString *myPath = [self saveFilePath]; 
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myPath]; 
if (fileExists) 
{ 
    NSArray *values = [[NSArray alloc] initWithContentsOfFile:myPath]; 
    _readerLabel.text = [[values objectAtIndex:0] stringValue]; 
    askedQuestions=[[values objectAtIndex:0] intValue]; 
    timeMin=[[values objectAtIndex:1]intValue]; 
    timeSec=[[values objectAtIndex:2]intValue]; 
    skipCount=[[values objectAtIndex:3]intValue]; 
    correctAnswers=[[values objectAtIndex:4]intValue]; 

} 

UIApplication *myApp = [UIApplication sharedApplication]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(applicationDidEnterBackground:) 
name:UIApplicationDidEnterBackgroundNotification 
object:myApp]; 

et je reçois ceci:

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]:  index (0) beyond bounds (0)' 
*** First throw call stack: 
(0x16a1012 0x13aee7e 0x16a0deb 0x16957e0 0x6891 0x312d 0x305817 0x305882 0x254a25 0x254dbf 0x254f55  0x25df67 0x221fcc 0x222fab 0x234315 0x23524b 0x226cf8 0x2703df9 0x2703ad0 0x1616bf5 0x1616962 0x1647bb6 0x1646f44 0x1646e1b 0x2227da 0x22465c 0x26cd 0x25f5) 
libc++abi.dylib: terminate called throwing an exception 

Où est le problème dans le code. S'il vous plaît aider!

Répondre

1

Vous ne vérifiez pas si quelque chose a fonctionné!

Qu'advient-il si

NSArray *values = [[NSArray alloc] initWithContentsOfFile:myPath]; 

soit échoue (le fichier peut ne pas exister) ou si elle retourne un tableau avec 0 articles en?

Vous devez ajouter quelque chose comme:

NSArray *values = [[NSArray alloc] initWithContentsOfFile:myPath]; 
if (values.count > 0) { 
    ... 
} 

Vous devez également définir un point d'arrêt sur applicationDidEnterBackground: et l'étape mais pour vous assurer que votre sauvegarde méthode fonctionne comme prévu.


De plus, je soupçonne que l'un de ces deux lignes est faux:

_readerLabel.text = [[values objectAtIndex:0] stringValue]; 
askedQuestions=[[values objectAtIndex:0] intValue]; 

ils sont tous deux demander l'élément à l'index 0

+0

Merci pour votre aide immédiate. Le code va bien si je n'utilise que objectAtIndex = 0, de l'index 1 à partir duquel il se bloque. –

+0

Ensuite, je suppose que le tableau retourné à partir de votre fichier ne contient qu'un seul objet :) – deanWombourne

+0

J'ai supprimé le fichier créé et tout est en ce moment. @dean merci pour votre aide. –

Questions connexes