Цель C, хранение данных в представлении UItableView даже после закрытия приложения - PullRequest
0 голосов
/ 30 ноября 2011

Я занимаюсь разработкой приложения с использованием XCode 4.2, и в разделе Приложения мне нужно сохранить строки формата NSString в UITableView и сохранить его снова при повторном запуске приложения ...

данные сохраненыв переменной NSMutableArray.Я нашел учебник, в котором использовалась старая версия XCodeversion с таким фрагментом кода:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    NSArray *archivedArray = [NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]];
    if (archivedArray == nil) {

        data = [[NSMutableArray alloc] init];                 

    } else {
        data = [[NSMutableArray alloc] initWithArray:archivedArray];
    }
}

и этой функцией

-(NSString *)dataFilePath{

    NSString *dataFilePath;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    dataFilePath = [documentDirectory stringByAppendingPathComponent:@"Test App-Info.plist"];
    return dataFilePath;

}

У меня возникают следующие две проблемы:

1-данные не сохраняются ... даже когда я переключаю представления 2 - когда я останавливаю приложение с устройства (т.е. я дважды щелкаю по кнопке Main и удаляю его из списка запущенных приложений), приложение вылетает: оно выходитк этому

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorld18AppDelegate class]));
    }
}

и в строке: return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorld18AppDelegate class])); я получаю зеленую ошибку Thread 1 : program received a signal "SIGKILL".

любые идеи, почему это происходит?

Отредактировано: еслив моем описании отсутствует информация, пожалуйста, дайте мне знать

отредактировано:

данные сохранены с помощью этой функции

-(void)saveData{
    [NSKeyedArchiver archiveRootObject:[data copy] toFile:[self dataFilePath]];
}

Отредактировано: вопрос: могу ли янужно где-то иметь функцию loadData?если да, что должно быть в нем?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2011

Если вы архивируете массив строк, вам не нужно использовать NSKeyedArchiver; NSArray предоставляет методы writeToFile и initWithContentsOfFile. Попробуйте их, так как вы будете менее смущены тем, что происходит. Когда вы это сделаете, используйте результаты , чтобы увидеть, успешно ли они выполняются (я замечаю, что вам не удается захватить BOOL, который сообщает вам, например, сохраняются ли ваши данные).

Вам нужно запустить это независимо от XCode, потому что вы не можете использовать метод, который вы описали, где вы принудительно выходите из приложения, если приложение было запущено из XCode - вы потерпите крах, если сделаете это. Вместо этого вы должны загрузить симулятор или устройство, запустив приложение, остановить приложение в XCode, а затем поиграть с приложением на симуляторе или устройстве независимо. Теперь, к сожалению, вы больше не можете видеть приложение в XCode, поэтому вам придется вставить множество операторов NSLog и позже изучить консоль, чтобы увидеть, что произошло.

0 голосов
/ 30 ноября 2011

Да, вам нужен метод loadData.Возможно, вы захотите вызвать его либо в application:didFinishLaunchingWithOptions: вашего делегата приложения, либо в viewDidLoad вашего контроллера представления.Это должно выглядеть примерно так:

- (void)loadData
{
    data = [NSKeyedUnarchiver unarchiveObjectWithFile:self.dataFilePath];
}

Как указал Мэтт, вместо этого вы можете использовать NSArray * * * * * * * * * * *.это нормальное поведение.Когда вы «дважды щелкаете по кнопке Main и удаляете ее из списка запущенных приложений», система отправляет ее SIGKILL.Сигнал SIGKILL завершает процесс приема с предубеждением.Если вы не хотите, чтобы ваше приложение получало SIGKILL, не «удаляйте его из списка запущенных приложений».

0 голосов
/ 30 ноября 2011

Попробуйте запустить приложение в фоновом режиме.Перейдите к файлу info.plist в Xcode и добавьте ключ. Приложение не работает в фоновом режиме и установите для него значение NO

. При ошибке SIGKILL это выглядит как проблема с памятью.Попробуйте отладить программу с помощью NSZombies.

...