2013-04-09 1 views
2

Я получаю ошибку- [NSDictionary initWithObjects: forKeys]: Количество объектов (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); 
    } 
} 
+4

Почему свойства 'NSString' помечены как' IBOutlet'? Для этого нет причин. – rmaddy

ответ

8

morningtime1 почти наверняка nil здесь, преждевременно заканчивая список массива.

Если вы использовали новый массив буквальный синтаксис здесь:

@[morningtime1, afternoontime1]; 

вы получите аварии, потому что это незаконно присвоить ноль к NSArray элементу.

+1

Почему бы не 'afternoontime1' nil? –

+0

Поскольку количество объектов равно нулю. (afternoontime1 тоже может быть нулевым, но вы никогда не заходите так далеко.) –

+0

Ну, 'afternoontime1' также может быть nil, но если количество массивов равно 0, это означает, что первый элемент в списке заканчивает список. –

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 никогда не устанавливается (вы устанавливаете свойство, которое фактически устанавливает сгенерированный ivar с именем _morningtime1).

Примечание стороны:

Избавьтесь от любых явных Иваров и @synthesize линий для свойств. Это позволит избежать такой путаницы.

+0

@downvoter - почему? Ивар «утренний 1» - это ноль, потому что он никогда не устанавливается. Изменив код для использования этого свойства, проблема исчезнет. – rmaddy

+0

Я не ваш спутник, и я согласен, что это хорошие практики, но нет уверенности в том, что использование ссылки ivar - проблема. –

Смежные вопросы