我在应用程序时遇到了一个小问题,但我是一个完整的初学者,首先是关于我想要完成的一些信息。
我有一个填充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];
}
答案 0 :(得分:1)
BOOL
不是对象,它是原始类型。因此,它无法(正确)保存在数组或字典中。您需要使用NSNumber
类来包装它:
[NSNumber numberWithBool:checked] //this should be added to the dictionary
答案 1 :(得分:0)
我是通过手机写的,所以我无法真正看到你的所有代码。但我只是想说,你想要实现的目标可能通过使用NSUserdefaults而不是保存文件来解决。你看过那个吗?
哦,就像埃文说的那样,布尔不是一个对象。只有对象可以存储在数组中。
答案 2 :(得分:0)
您是否有理由将单元格添加到词典中? UITableViewCell不是属性列表兼容对象,因此它可以防止您的阵列正确保存。