我收到错误
- [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);
}
}
答案 0 :(得分:8)
morningtime1
几乎肯定是nil
,过早地结束了数组列表。
如果你在这里使用了新的数组文字语法:
@[morningtime1, afternoontime1];
你会崩溃,因为将nil分配给NSArray
元素是违法的。
答案 1 :(得分:0)
这一行:
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。如你所知,永远不会设置morningtime1
ivar(你设置实际设置生成的名为_morningtime1
的ivar的属性。
旁注:
删除属性的任何明确的ivars和@synthesize
行。这样可以避免这种混淆。