无法将数据写入plist文件

我已经检查了互联网上的方法,但是无法更新数据。

在pickerView:didSelectRow:inComponent方法中,我testing了cameraCode,在pickerView中select不同的行后,数组的键已经被改变了,但是这个值没有写在我的plist文件中,名为MultiSetting.plist,即使我写下声明:

path = [[NSBundle mainBundle] pathForResource:@"MultiSetting" ofType:@"plist"]; [settingInfo writeToFile:path atomically:YES]; 

有什么可以帮助我提高我的技能?

这是我的代码:

MultiSettingViewController.h

 #import <UIKit/UIKit.h> @interface MultiSettingViewController : UIViewController @property (nonatomic) NSInteger *camNum; @property (nonatomic, retain) IBOutlet UIPickerView *picker; @property (strong, nonatomic) IBOutlet UITextField *textField; @property (nonatomic,retain) IBOutlet UISegmentedControl *segmentedControl; @property (retain, nonatomic) IBOutlet UILabel *regionLabel; @property (retain, nonatomic) IBOutlet UILabel *placeLabel; @property (nonatomic, retain) NSArray *placeArray; @property (strong, nonatomic) NSMutableArray *settingArray; @property (strong, nonatomic) UIToolbar *doneToolbar; @property (strong, nonatomic) NSBundle *bundle; @property (strong, nonatomic) NSString *path; @property (strong, nonatomic) NSBundle *bundle1; @property (strong, nonatomic) NSString *path1; - (IBAction)segmentedControlIndexChanged; - (void)doneBtn_OnClick:(id)sender; - (IBAction)textfield_OnClick:(id)sender; @end 

MultiSettingViewController.m

 #import "MultiSettingViewController.h" @implementation MultiSettingViewController @synthesize camNum, picker, placeArray, settingArray, textField, doneToolbar, segmentedControl, bundle, path, bundle1, path1, regionLabel, placeLabel; - (void)viewDidLoad{ [super viewDidLoad]; //NSLog(@"%i", camNum); bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"HK" ofType:@"plist"]; placeArray = [[NSArray alloc] initWithContentsOfFile:path]; bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"MultiSetting" ofType:@"plist"]; settingArray = [[NSMutableArray alloc] initWithContentsOfFile:path]; if (self.segmentedControl.selectedSegmentIndex == 0){ NSInteger selectedRow = [self.picker selectedRowInComponent:0]; NSDictionary *placeInfo = [placeArray objectAtIndex:selectedRow]; [regionLabel setText:[placeInfo objectForKey:@"name"]]; } if(self.doneToolbar == nil){ self.doneToolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, 0, 320, 40)]; UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneBtn_OnClick:)]; [self.doneToolbar setItems: [NSArray arrayWithObject:doneBtn]]; } self.textField.inputView = self.picker; self.textField.inputAccessoryView = self.doneToolbar; self.textField.delegate = self; self.picker.delegate = self; self.picker.dataSource = self; self.picker.hidden = YES; self.doneToolbar.barStyle = UIBarStyleBlackTranslucent; self.doneToolbar.hidden = YES; } -(IBAction) segmentedControlIndexChanged{ switch (self.segmentedControl.selectedSegmentIndex){ case 0: bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"HK" ofType:@"plist"]; placeArray = [[NSArray alloc] initWithContentsOfFile:path]; [self.picker reloadAllComponents]; NSInteger selectedRow = [self.picker selectedRowInComponent:0]; NSDictionary *placeInfo = [placeArray objectAtIndex:selectedRow]; [regionLabel setText:[placeInfo objectForKey:@"name"]]; break; case 1: bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"KW" ofType:@"plist"]; placeArray = [[NSArray alloc] initWithContentsOfFile:path]; [self.picker reloadAllComponents]; selectedRow = [self.picker selectedRowInComponent:0]; placeInfo = [placeArray objectAtIndex:selectedRow]; [regionLabel setText:[placeInfo objectForKey:@"name"]]; break; case 2: bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"TW" ofType:@"plist"]; placeArray = [[NSArray alloc] initWithContentsOfFile:path]; [self.picker reloadAllComponents]; selectedRow = [self.picker selectedRowInComponent:0]; placeInfo = [placeArray objectAtIndex:selectedRow]; [regionLabel setText:[placeInfo objectForKey:@"name"]]; break; case 3: bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"TM" ofType:@"plist"]; placeArray = [[NSArray alloc] initWithContentsOfFile:path]; [self.picker reloadAllComponents]; selectedRow = [self.picker selectedRowInComponent:0]; placeInfo = [placeArray objectAtIndex:selectedRow]; [regionLabel setText:[placeInfo objectForKey:@"name"]]; break; case 4: bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"TP" ofType:@"plist"]; placeArray = [[NSArray alloc] initWithContentsOfFile:path]; [self.picker reloadAllComponents]; selectedRow = [self.picker selectedRowInComponent:0]; placeInfo = [placeArray objectAtIndex:selectedRow]; [regionLabel setText:[placeInfo objectForKey:@"name"]]; break; case 5: bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"ST" ofType:@"plist"]; placeArray = [[NSArray alloc] initWithContentsOfFile:path]; [self.picker reloadAllComponents]; selectedRow = [self.picker selectedRowInComponent:0]; placeInfo = [placeArray objectAtIndex:selectedRow]; [regionLabel setText:[placeInfo objectForKey:@"name"]]; break; case 6: bundle = [NSBundle mainBundle]; path = [bundle pathForResource:@"LT" ofType:@"plist"]; placeArray = [[NSArray alloc] initWithContentsOfFile:path]; [self.picker reloadAllComponents]; selectedRow = [self.picker selectedRowInComponent:0]; placeInfo = [placeArray objectAtIndex:selectedRow]; [regionLabel setText:[placeInfo objectForKey:@"name"]]; break; default: break; } } #pragma mark - #pragma mark UIPickerViewDataSource methods - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return [placeArray count]; } #pragma mark - #pragma mark UIPickerViewDelegate methods - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { NSDictionary *placeInfo = [placeArray objectAtIndex:row]; return [placeInfo objectForKey:@"name"]; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { NSDictionary *placeInfo = [placeArray objectAtIndex:row]; NSString *name = [placeInfo objectForKey:@"name"]; self.placeLabel.text = name; NSString *code = [placeInfo objectForKey:@"cameraCode"]; NSMutableDictionary *settingInfo = [settingArray objectAtIndex:(NSInteger)camNum]; NSLog(@"%@", [settingInfo objectForKey:@"cameraCode"]); [settingInfo setObject:code forKey:@"cameraCode"]; NSLog(@"%@", [settingInfo objectForKey:@"cameraCode"]); path = [[NSBundle mainBundle] pathForResource:@"MultiSetting" ofType:@"plist"]; [settingInfo writeToFile:path atomically:YES]; //[self obtainPic:cameraCode]; /*aTimer = [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES]; */ } - (void)doneBtn_OnClick:(id)sender{ [self.textField endEditing:YES]; self.picker.hidden = YES; self.doneToolbar.hidden = YES; } - (IBAction)textfield_OnClick:(id)sender{ self.picker.hidden = NO; self.doneToolbar.hidden = NO; } - (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

真的非常感谢您的真诚帮助!

包中的所有东西都是只读的 ; 因此,您的日志中可能会出现Cocoa Error 513( “操作无法完成,操作不允许” )。

您有三个其他文件夹用于读取/写入数据存储: TempCacheDocuments

您可以在运行时在Document文件夹中创build文件MultiSetting.plist ,然后写入它。


您可以像这样获取文档目录的path:

  NSArray * documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString * documentDirectory = [documentPath objectAtIndex:0]; 

编辑

然后,你可以在那里复制你的pList( 注意,如前所述,它是只读的,所以你将无法移动它,也不能从你的包中删除它 )。 为此,使用NSFileManagers的函数-copyItemAtPath :

 - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error 

您正尝试写入驻留在应用程序包内的文件。 这当然不是写入用户设置的位置。 而且iOS也不会让你,因为沙盒阻止应用程序包的应用程序写入访问。

使用适当的API来获得一个文件系统的位置,你可以真正写入。 文档在这里。