Xcode Saving NSMutableArray of String& BOOL值

时间:2010-12-19 20:53:40

标签: objective-c xcode nsmutablearray

我在应用程序时遇到了一个小问题,但我是一个完整的初学者,首先是关于我想要完成的一些信息。

我有一个填充NSMutableArray的plist,它包含许多值,每个值都有一个字符串和一个BOOL,我可以让程序在打开应用程序时保存文件的副本并将数据加载到tableview中复选标记的附件。

现在复选标记工作正常,您可以选择不同的项目,复选标记仅显示在这些项目上,而不是其他项目,如果您检查日志,每个项目的详细信息检查BOOL已更改但是当我来保存时第二次,当我第二次打开应用程序时,它不会持续存在,只是每次都将它保存为0。

这是我的一些代码,任何帮助都将不胜感激。

由于 布拉德

    - (void)viewDidLoad {

 BOOL success;

 NSFileManager *fileManager = [NSFileManager defaultManager];
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"CustomChecklist.plist"];

 success = [fileManager fileExistsAtPath:filePath];
 NSLog(@"STATUS OF SUCCESS %d",success);

 if (!success) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"OriginalChecklist" ofType:@"plist"];
  success = [fileManager copyItemAtPath:path toPath:filePath error:NULL];
  self.dataArray = [NSMutableArray arrayWithContentsOfFile:filePath];
  NSLog(@"IF STATEMENT CREATING THE FILE");
 }else {
  self.dataArray = [NSMutableArray arrayWithContentsOfFile:filePath];
  NSLog(@"IF STATEMENT READING THE FILE");
 }

 NSLog(@"location information %@", filePath);
    [super viewDidLoad];
}

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 static NSString *kCustomCellID = @"MyCellID";
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCustomCellID];
 if (cell == nil)
 {
  cell = [[[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCustomCellID]  autorelease];
  cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  cell.selectionStyle = UITableViewCellSelectionStyleBlue;
 }

 NSMutableDictionary *item = [dataArray objectAtIndex:indexPath.row];
 cell.textLabel.text = [item objectForKey:@"text"];

 [item setObject:cell forKey:@"cell"];

 BOOL checked = [[item objectForKey:@"checked"] boolValue];
 UIImage *image = (checked) ? [UIImage imageNamed:@"checked.png"] : [UIImage imageNamed:@"unchecked.png"];

 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
 CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
 button.frame = frame; // match the button's size with the image size

 [button setBackgroundImage:image forState:UIControlStateNormal];

 // set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet
 [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside];
 button.backgroundColor = [UIColor clearColor];
 cell.accessoryView = button;

  return cell;
 }

    - (void)viewWillDisappear:(BOOL)animated 
{  

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *savePath = [documentsDirectory stringByAppendingPathComponent:@"CustomChecklist.plist"];
 NSLog(@"View Will Disappear SAVE location information %@", savePath);
 [dataArray writeToFile:savePath atomically:YES];
}

3 个答案:

答案 0 :(得分:1)

BOOL不是对象,它是原始类型。因此,它无法(正确)保存在数组或字典中。您需要使用NSNumber类来包装它:

[NSNumber numberWithBool:checked] //this should be added to the dictionary

答案 1 :(得分:0)

我是通过手机写的,所以我无法真正看到你的所有代码。但我只是想说,你想要实现的目标可能通过使用NSUserdefaults而不是保存文件来解决。你看过那个吗?

哦,就像埃文说的那样,布尔不是一个对象。只有对象可以存储在数组中。

答案 2 :(得分:0)

您是否有理由将单元格添加到词典中? UITableViewCell不是属性列表兼容对象,因此它可以防止您的阵列正确保存。