我是创建应用程序的新手,并且还没有完全弄清楚如何在XCode中使用plist函数。
我的问题是我在视图控制器中有3种不同的输入方法,用户将从中选择值,步进器,选择器视图和记录当前日期的日期,我想保存到plist,以便用户可以在另一个视图控制器的表视图中查看这些条目。
我之前没有真正使用过plist,因此我的问题可能听起来很愚蠢,但不管我需要一些帮助。
到目前为止,我有输入设置,但他们并没有真正做任何事情,我知道这个问题非常基本,但我很难找到有关这方面的信息并不太技术化。
如果这样做有用,我可以发布我的代码。
非常感谢任何帮助。
@property (weak, nonatomic) IBOutlet UILabel *balesFedLabel;
@property (weak, nonatomic) IBOutlet UIStepper *balesFedStepper;
@property (weak, nonatomic) IBOutlet UIPickerView *fieldPickerView;
@property (weak, nonatomic) IBOutlet UILabel *dateLabel;
@property (weak, nonatomic) IBOutlet UITextField *sheepGroup;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *backButton;
//Actions
- (IBAction)stepperValueChange:(id)sender;
- (IBAction)saveButton:(id)sender;
- (IBAction)textFieldDoneEditing:(id)sender;
@property NSArray *dataSource;
@property NSString *tempFieldSelection;
@property(nonatomic) UIKeyboardAppearance keyboardAppearanceDark;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self setupArray];
NSLocale *gbLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
NSString *dateFormatString = [NSDateFormatter dateFormatFromTemplate:@"dd/MM/yyyy" options:0 locale:gbLocale];
NSLog(@"dataFormatString: %@", dateFormatString);
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:dateFormatString];
NSString *stringFromDate = [dateFormatter stringFromDate:[NSDate date]];
self.dateLabel.text = stringFromDate;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {[self.view endEditing:YES];
}
- (void)setupArray {
_dataSource = [[NSArray alloc] initWithObjects:@"Cow Pasture", @"Top Lot", @"East Lot", @"West Lot", @"Front Meadow", @"Big Meadow", nil];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return [_dataSource count];
}
- (UIView *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [_dataSource objectAtIndex:row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
self.tempFieldSelection = [_dataSource objectAtIndex:[pickerView selectedRowInComponent:0]];
}
- (IBAction)stepperValueChange:(id)sender {double baleStepperValue = self.balesFedStepper.value;
self.balesFedLabel.text = [NSString stringWithFormat:@"%.f", baleStepperValue];
}
- (IBAction)textFieldDoneEditing:(id)sender {[sender resignFirstResponder];
}
- (IBAction)saveButton:(id)sender {
NSLog(@"Bales Fed: %@", self.balesFedLabel.text);
NSLog(@"Sheep Group: %@", self.sheepGroup.text);
NSLog(@"Current Field: %@", self.tempFieldSelection);
NSLog(@"Last Date Fed: %@", self.dateLabel.text);
}
答案 0 :(得分:3)
使用NSMutableDictionary
并将其传递到媒体资源中的目的地UIViewController
。
例如,在源视图控制器中:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[@"Bales Fed"] = self.balesFedLabel.text;
dict[@"Sheep Group"] = self.sheepGroup.text;
dict[@"Current Field"] = self.tempFieldSelection;
dict[@"Last Date Fed"] = self.dateLabel.text;
只需将dict
传递给目标视图控制器即可。
如果要使用plist,这些是NSDictionary类中可用的两种方法:
- writeToFile:atomically:
将字典写入文件(以plist格式)
和类方法dictionaryWithContentsOfFile:
或实例方法initWithContentsOfFile:
从磁盘中检索字典。
在您的情况下,将字典写入plist格式的文件:
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"myData.plist"];
[dict writeToFile:filePath atomically:NO];
在目标视图控制器中,使用此代码从磁盘检索plist:
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"myData.plist"];
NSDictionary *myData = [NSDictionary dictionaryWithContentsOfFile:filePath];
Apple的第一种方法文档:
此方法以递归方式验证所有包含的对象是属性列表对象(
NSData
,NSDate
,NSNumber
,NSString
,NSArray
的实例,或者NSDictionary
)在写出文件之前,如果所有对象都不是属性列表对象,则返回NO,因为结果文件不是有效的属性列表。如果字典的内容都是属性列表对象,则此方法编写的文件可用于使用类方法
dictionaryWithContentsOfFile:
或实例方法initWithContentsOfFile:
初始化新字典。
我还建议您阅读指南Property List Programming Guide
答案 1 :(得分:0)
即使我不建议使用.plist文件,也是使用它的代码:
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"YOUR_FILE_NAME" ofType:@"plist"];
NSDictionary *plistDic = [NSDictionary dictionaryWithContentsOfFile:plistPath];
答案 2 :(得分:0)
由于您只是将少量用户输入的数据从一个视图控制器传递到另一个视图控制器,因此您不需要使用PLists,CoreData和NSUserDefaults。这些都适用于持久性数据,但从你的描述来看,它听起来只是暂时的东西。
只需将用户数据存储在参数中,然后使用prepareForSegue方法将它们传递到目标ViewController。有关详细信息,请参阅this SO answer。