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

2 に答える 2

8

morningtime1ほぼ確実nilにここにあり、配列リストを途中で終了します。

ここで新しい配列リテラル構文を使用した場合:

@[morningtime1, afternoontime1];

要素に nil を割り当てることは違法であるため、クラッシュが発生しNSArrayます。

于 2013-04-09T18:32:03.403 に答える
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]];

つまり、ivar ではなくプロパティを参照します。あなたが持っているように、morningtime1ivarは決して設定されません(生成されたivarという名前の実際に設定されているプロパティを設定します_morningtime1)。

サイドノート:

プロパティの明示的な ivar と@synthesize行をすべて取り除きます。これにより、このような混乱を避けることができます。

于 2013-04-09T18:32:09.733 に答える