– :对象的数量(0)不同于键的数量(2)

我得到的错误

– [NSDictionary initWithObjects:forKeys:]:对象的数量(0)不同于键的数量(2)'

这是我的代码保存plist。

@interface setting : UIViewController{ UIDatePicker *datePicker; IBOutlet UILabel * morningtime; UIDatePicker *afternoonpicker; NSString*morningtime1; NSString*afternoontime1; IBOutlet UILabel *afternoontime; } @property (nonatomic,retain) IBOutlet UIDatePicker *datePicker; @property (strong, nonatomic) IBOutlet UIDatePicker *afternoonpicker; @property (nonatomic, retain) IBOutlet NSString *morningtime1; @property (nonatomic, retain) IBOutlet NSString *afternoontime1; @property (nonatomic, retain) IBOutlet UILabel *morningtime; @property (nonatomic, retain) IBOutlet UILabel *afternoontime; @property (weak, nonatomic) IBOutlet UIButton *morning; - (IBAction)savetext:(id)sender { NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); // get documents path NSString *documentsPath = [paths objectAtIndex:0]; // get the path to our Data/plist file NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"]; self.morningtime1 = morningtime.text; self.afternoontime1 = afternoontime.text; NSDictionary *plistDict = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects: morningtime1, afternoontime1, nil] forKeys:[NSArray arrayWithObjects: @"Morning", @"Afternoon", nil]]; NSString *error = nil; // create NSData from dictionary NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; // check is plistData exists if(plistData) { // write plistData to our Data.plist file [plistData writeToFile:plistPath atomically:YES]; } else { NSLog(@"Error in saveData: %@", error); } } 

morningtime1几乎肯定是在这里,过早地结束数组列表。

如果您在这里使用新的数组字面语法:

 @[morningtime1, afternoontime1]; 

你会得到一个崩溃,因为将nil分配给一个NSArray元素是非法的。

这一行:

 NSDictionary *plistDict = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects: morningtime1, afternoontime1, nil] forKeys:[NSArray arrayWithObjects: @"Morning", @"Afternoon", nil]]; 

应该:

 NSDictionary *plistDict = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects: self.morningtime1, self.afternoontime1, nil] forKeys:[NSArray arrayWithObjects: @"Morning", @"Afternoon", nil]]; 

换句话说,引用属性,而不是ivars。 如你morningtime1morningtime1伊娃永远不会被设置(你设置的是实际设置生成伊娃的名字叫做_morningtime1 )。

边注:

摆脱任何显式的ivars和@synthesize行的属性。 这将避免这种混淆。