【问题标题】:Problems re-writing a plist重写 plist 的问题
【发布时间】:2014-03-30 04:43:48
【问题描述】:

好的,我在覆盖我创建的 plist 的内容时遇到了问题。我已包含以下所有代码:

因此,在我的第一个视图控制器中,我创建了 plist,然后使用更新目录方法对其进行了更新。好的,我的问题出现在覆盖 plist 区域中。我的想法是从文件中创建一个字典,然后添加/覆盖某些键,然后重新编写文件。此代码允许我编写没有错误的对象,但是当我尝试从文件中读取值时,所有新值都为 null。

更新:代码现在可以工作了。我需要将 Area_#_Total_L 更改为 Area_#_Total_L.text。这是因为您可以添加到字典中的项目数量有限(有关对象类型,请参见答案之一)。

创建目录:

-(void)Create_Directory {

    // Create File Location

    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; //2
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Temporary_Variable_Repository.plist"];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath: path])
    {
        NSString *bundle = [[NSBundle mainBundle] pathForResource:@"Temporary_Variable_Repository" ofType:@"plist"];
        [fileManager copyItemAtPath:bundle toPath: path error:&error];
    }

    // End
        NSLog(@"path in ViewController: %@", path);
    DataLocation = path;

}

更新目录:

-(void)Update_Directory {

    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: DataLocation];

    //All Variables that need to be saved need to be listed here
    //Creating Directory Example
    //[data setObject:@"Directory" forKey:@"Key"];

    NSLog(@"Saving Variables...");

    int Temp = [[data valueForKey:@"-Run_ID"] intValue]+1;
    NSLog(@"Run ID: %d", Temp);

    [data setObject:[NSNumber numberWithInt:Temp] forKey:@"-Run_ID"];
    [data setObject:Date_Time forKey:@"-Run_Date_Time"];
    [data setObject:@"In Progress" forKey:@"-Run_Status"];
    [data setObject:@"ViewController" forKey:@"-Run_Chapter"];
    [data setObject:@"0" forKey:@"-Run_Page"];
    [data setObject:@"User" forKey:@"-User"];
    [data setObject:@"0001" forKey:@"-User_Device"];

    //End

    BOOL result = [data writeToFile: DataLocation atomically:YES];
    NSLog(result ? @"Yes" : @"No");    
}

覆盖 Plist

NSLog(@"Saving Variables...");

//Verify the variables are updated prior to transfer
[self RefreshAreaLabels];

//Close keypad
[self closeKeypad];


//Prep next screen for loading
RoofSlope *NewView = [[RoofSlope alloc] initWithStyle:UITableViewStylePlain];

//Send location of Temp Var Rep
NewView.DataLocation_Pass2 = DataLocation_Pass1;

//Create a copy of Temp Var Rep
NSMutableDictionary *ViewController_Reference = [[NSMutableDictionary alloc] initWithContentsOfFile:DataLocation_Pass1];

//Write variables
[ViewController_Reference setObject:@"AtticArea" forKey:@"-Run_Chapter"];

[ViewController_Reference setObject:[NSString stringWithFormat:@"%@", Area_1_Length_TF.text] forKey:@"Area_1_Length"];
[ViewController_Reference setObject:Area_1_Width_TF.text forKey:@"Area_1_Width"];
[ViewController_Reference setObject:Area_1_Total_L.text forKey:@"Area_1_Total"];

[ViewController_Reference setObject:Area_2_Length_TF.text forKey:@"Area_2_Length"];
[ViewController_Reference setObject:Area_2_Width_TF.text forKey:@"Area_2_Width"];
[ViewController_Reference setObject:Area_2_Total_L.text forKey:@"Area_2_Total"];

[ViewController_Reference setObject:Area_3_Length_TF.text forKey:@"Area_3_Length"];
[ViewController_Reference setObject:Area_3_Width_TF.text forKey:@"Area_3_Width"];
[ViewController_Reference setObject:Area_3_Total_L.text forKey:@"Area_3_Total"];

[ViewController_Reference setObject:Area_4_Length_TF.text forKey:@"Area_4_Length"];
[ViewController_Reference setObject:Area_4_Width_TF.text forKey:@"Area_4_Width"];
[ViewController_Reference setObject:Area_4_Total_L.text forKey:@"Area_4_Total"];

 [ViewController_Reference setObject:@"TEST" forKey:@"-Run_ID"];

[ViewController_Reference setObject:[NSNumber numberWithDouble:[TotalAreaValue_L.text doubleValue]] forKey:@"Total_Area"];

//Debug
NSLog(@"Area_1_Length: %@", [ViewController_Reference valueForKey:@"Area_1_Length"]);
NSLog(@"_Run_ID: %@", [ViewController_Reference valueForKey:@"-Run_ID"]);

//Update Variable Repository
//This writes the updated variables to the plist
BOOL result = [ViewController_Reference writeToFile: DataLocation_Pass1 atomically:YES];    

NSLog(result ? @"Yes" : @"No");

【问题讨论】:

    标签: ios plist overwrite


    【解决方案1】:

    作为苹果文档:

    如果数组的内容都是属性列表对象(NSString, NSData、NSArray 或 NSDictionary 对象),由此写入的文件 方法可用于使用类方法初始化一个新数组 arrayWithContentsOfFile: 或实例方法 initWithContentsOfFile:.此方法递归地验证所有 包含的对象是在写出之前的属性列表对象 文件,如果所有对象都不是属性列表对象,则返回 NO, 因为生成的文件不是有效的属性列表。

    确保所有对象都是属性列表对象(NSString、NSData、NSArray 或 NSDictionary 对象)。

    [NSNumber numberWithInt:Temp] 可能是问题所在。

    【讨论】:

    • 我会验证我的项目类型,但我认为我的问题不在于“numberWithInt”。因为该值是通过 NSLog 显示的,并且在两个视图控制器中都是正确的。我认为来自 viewcontroller 的所有值都已正确保存。我用 NSLog 语句检查了它们。问题是当我添加新对象并尝试覆盖新对象不显示的文件时。相反,该文件仍然显示在 viewcontroller one 中设置的值。
    • 好的更新解决了这个问题。你是对的......有点问题是当我试图转移Area_#_Total_L时。问题是我试图将标签保存到字典中。相反,它需要是 Area_#_Total_L.text 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多