我有一个使用NSMutableArray填充的UITableView。我正在使用xcode 4.2

如果我切换应用程序,NSMutable数组中的数据将保留,但在以下两种情况下它们将被擦除:
1-用户切换视图并返回。

2-该应用程序已完全关闭(即用户双击“主要”按钮,并将其从正在运行的应用程序列表中删除)

这是我正在使用的代码

-(NSString *)dataFilePath{

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

}

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

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
  ...

    //saving the history

    NSArray *archivedArray =[NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]];
    if (archivedArray == nil) {
        data = [[NSMutableArray alloc] init];
    }
    else {
        [self loadData];
        [mainTableView reloadData];
    }
}

如果我错过了什么,请告诉我

谢谢

编辑:

保存数据功能在两个位置加载:
1-我正在开发的应用程序扫描QR码,因此在以下功能中调用保存数据:
- (void) imagePickerController: (UIImagePickerController*) reader
 didFinishPickingMediaWithInfo: (NSDictionary*) info
{
....
   id<NSFastEnumeration> results =
    [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results){
        // EXAMPLE: just grab the first barcode
       break;
    }

    if(!symbol)
        return;

    // EXAMPLE: do something useful with the barcode data
    theBarcodeString = symbol.data;

    //adding the string to the list

    [data addObject:theBarcodeString];
    [self saveData];
    [mainTableView reloadData];
    [self endText];
    stringLabel.text=theBarcodeString;

...
}

编辑数据时也会调用它:
    -(IBAction)editTable{
        UIBarButtonItem *leftItem;
        [mainTableView setEditing:!mainTableView.editing animated:YES];
        if (mainTableView.editing) {
            leftItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(editTable)];
        }
        else {

            leftItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editTable)];

    }

    [self saveData];
    [mainTableView reloadData];

}

最佳答案

您需要研究以下调用:

applicationDidEnterBackground
applicationWillEnterForeground
applicationDidBecomeActive
applicationWillTerminate

它们都是UIApplication的方法。您的需求将决定上述存储区中的哪一个,并根据何时发生恢复数据。

10-08 09:23
查看更多