我的iphone / ipad项目中有这个简单的json文件。
{"initial_page" : Page_Selected}
Page_Selected
是NSInteger
我想通过UIPickerView
修改"initial_page"
的值。怎么做?
当然我已经完成了UiPickerWiew
选择部分和json修改,我会将其写入
-(void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponents:(NSInteger)component{ }
功能
也许完成这项工作的函数是[[jsonParsed setInteger:row forKey:@"initial_page"]
但是这样,调试器会返回我"无法识别的选择器已发送"异常。
我只需要用json
作为键修改"initial_page"
参数的部分。
任何人都可以帮助我吗?
这就是我得到的。
NSError *jsonParsingError = nil;
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"json"];
NSMutableDictionary *configJson = [NSJSONSerialization
JSONObjectWithData:[NSData dataWithContentsOfFile:filePath]
options:NSJSONReadingMutableContainers error:&jsonParsingError];
[configJson setValue:[NSNumber numberWithInt:row] forKey:@"initial_page"];
NSLog(@"%@",jsonParsingError);
最后一行返回(null)
,所以json文件没问题。
但是,如果我打印出[configJson objectForKey:@"inital_page"]
,那么我可以看到它发生变化......那么,是否有一种"提交"或者"保存"命令以使其持久化?
以下建议:
NSData * modified = [NSJSONSerialization dataWithJSONObject:configJson options:NSJSONWritingPrettyPrinted error:&jsonParsingError];
[modified writeToFile:filePath options:NSDataWritingAtomic error:&jsonParsingError];
NSLog(@"returned error: %@", [jsonParsingError localizedDescription]);
再次,最后一行返回(null)
但我无法在文件中找到任何修改
更改后,我可以保存initial_page
的修改,但这仅适用于iPhone/iPad Simulator
,而不适用于实际的设备调试。
这就是我的所作所为:
if([modified wirteToFile:filePath options:NSDataWritingFileProtectionNone error:&jsonParsingError])
NSLog(@"writing ok")
else
NSLog(@"not ok with error :%@",jsonParsinError);
Iphone simulator
对最后4行没有问题,但是当我在物理iPhone
上运行时,最后NSLog
给出了:
"not ok with error : Error Domain=NSCocoaErrorDomain Code=513 The Operation Could not be completed. Operation not permitted"
似乎在写json文件时拒绝了许可。
答案 0 :(得分:1)
问题解决了:主要的错误概念是在主包中编写和/或修改文件。现在我在NSDocumentDirectory
这样,我没有错误,我可以直接在iPhone中读取/写入数据。
我遵循了本指南:link当然我使用json作为过滤器而不是pdf。
答案 1 :(得分:0)
首先,您应该通过将Page_Selected
的初始值指定为数字来使您的json有效,否则您将无法解析它。例如{"initial_page" : -1}
,因此您确定它是无效的初始值,并且您不会意外使用它
然后在解析时,指定NSJSONReadingMutableContainers
作为+JSONObjectWithData:options:error:
方法
然后您可以实际修改获得的NSMutableDictionary
实例:
[jsonDictionary setValue:[NSNumber numberWithInt:row] forKey:@"initial_page"]
答案 2 :(得分:0)
是否有一种“提交”或“保存”命令才能使其持久化?
您需要将JSON写回文件。
使用NSJSONSerialization的-dataWithJSONObject:options:error:方法创建NSData,然后将其写入文件。请注意,您不应尝试写入应用程序包中的资源。
答案 3 :(得分:0)
将NSDataWritingFileProtectionNone
作为option
添加到dataWithJSONObject
函数中。现在它仅适用于模拟器。