2012-11-21 4 views
1

Я пытаюсь сохранить данные при нажатии кнопки «Домой». Вот мой код.«NSRangeException» при чтении данных из файла

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

метод saveFilePath предоставляет путь к файлу.

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

и я получаю это:

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 

Где проблема в коде. Пожалуйста помоги!

ответ

1

Вы не проверяете, что-то сработало!

Что произойдет, если

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

либо выходит из строя (файл не может существовать), или если она возвращает массив с 0 пунктов в?

Вам нужно добавить что-то вроде:

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

Вы также должны установить контрольную точку на applicationDidEnterBackground: и шаг за шагом, хотя, чтобы убедиться, что ваш метод сохранения работает, как вы ожидаете.


Кроме того, я подозреваю, что одна из этих двух линий не так:

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

они оба просят элемент с индексом 0

+0

Спасибо за вашу немедленную помощь. Код идет правильно, если я использую только objectAtIndex = 0, начиная с индекса 1 и заканчивая его сбоем. –

+0

Тогда я предполагаю, что массив, возвращенный из вашего файла, содержит только один объект :) – deanWombourne

+0

Я удалил созданный файл, и все прямо сейчас. @dean Спасибо за вашу помощь. –

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