0

1つの変数letsMeet.startTimeLabelに保存するのに問題があります。NSLogを選択した直後は正しい値が表示されますが、別の変数(letsMeet.endTimeLabel)に保存した後、letsMeet.startTimeLabelは(NULL)に変更されます。以下はコードです:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
switch (actionSheet.tag)
{
    case 1:
    {
        if (buttonIndex == 0)
        {
            UIDatePicker *startDatePicker = (UIDatePicker *)[actionSheet viewWithTag:kDatePickerTag1];

            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"dd"];
            NSDate *selectedDate = [startDatePicker date];

            NSDateFormatter *dayFormatter = [[NSDateFormatter alloc] init];
            [dayFormatter setDateFormat:@"EEEE"];
            NSDate *selectedDay= [startDatePicker date];

            NSDateFormatter *monthFormatter = [[NSDateFormatter alloc] init];
            [monthFormatter setDateFormat:@"MMMM"];
            NSDate *selectedMonth = [startDatePicker date];

            NSString *date = [[NSString alloc] initWithFormat:@"%@", [dateFormatter stringFromDate:selectedDate]];
            DateLabel.text = date;
            [letsMeet setDateLabel:date];

            NSString *month = [[NSString alloc] initWithFormat:@"%@", [dayFormatter stringFromDate:selectedMonth]];
            MonthLabel.text = month;
            [letsMeet setMonthLabel:month];

            NSString *day = [[NSString alloc] initWithFormat:@"%@", [monthFormatter stringFromDate:selectedDay]];
            DayLabel.text = day;
            [letsMeet setDateLabel:day];

            NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
            [timeFormatter setDateFormat: @"h:mm a"];
            NSDate *selectedStartTime = [startDatePicker date];

            NSString *startTime = [[NSString alloc] initWithFormat:@"%@", [timeFormatter stringFromDate:selectedStartTime]];
            StartTimeLabel.text = startTime;
            [letsMeet setStartTimeLabel:startTime];

            NSError *error = nil;
            if (![managedObjectContext save:&error]){

                NSLog(@"Error Saving");
            }
        }
        NSLog (@"This is the StartTime after selecting %@", letsMeet.startTimeLabel);
    }
    break;

    case 2:
    {
        if (buttonIndex == 0)
        {
            UIDatePicker *endTimePicker = (UIDatePicker *)[actionSheet viewWithTag:kDatePickerTag2];
            NSDateFormatter *endTimeFormatter = [[NSDateFormatter alloc] init];
            [endTimeFormatter setDateFormat: @"h:mm a"];
            NSDate *endSelectedTime = [endTimePicker date];
            NSString *endTime = [[NSString alloc] initWithFormat:@"%@", [endTimeFormatter stringFromDate:endSelectedTime]];
            EndTimeLabel.text = endTime;
            [letsMeet setEndTimeLabel:endTime];
            NSLog (@"This is the EndTime %@", letsMeet.endTimeLabel);
            NSLog (@"This is the StartTime after selecting BOTH %@", letsMeet.startTimeLabel);
        }
        else if (buttonIndex == 1)
        {
            EndTimeLabel.text = @"Whenever";
            [letsMeet setEndTimeLabel:EndTimeLabel.text];
        }
        NSError *error = nil;
        if (![managedObjectContext save:&error]) {
    }

}break;

    // Handle the error.
}

}


-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destinationViewController = segue.destinationViewController;
    NSLog (@"Prepare For Segue StartTime %@", letsMeet.startTimeLabel);
    NSLog (@"Prepare For Segue EndTime%@", letsMeet.endTimeLabel);
}

ログは次のとおりです。

2013-02-20 21:38:24.253 AppointmentTime[3129:c07] This is the StartTime after selecting 9:30 AM
2013-02-20 21:38:32.325 AppointmentTime[3129:c07] This is the EndTime 12:15 PM
2013-02-20 21:38:32.325 AppointmentTime[3129:c07] This is the StartTime after Selecting BOTH (null)
2013-02-20 21:38:34.069 AppointmentTime[3129:c07] Prepare For Segue StartTime (null)
2013-02-20 21:38:34.069 AppointmentTime[3129:c07] Prepare For Segue EndTime12:15 PM

Q:letsMeet.startTimeLabelが最初に正しく表示され、EndTimeを選択すると、NULLに変わるのはなぜですか。EndTimeは、prepareForSegueまでずっと正しい値を表示し続けることに注意してください。変!

4

1 に答える 1

1

ログとコードによると、スイッチブロックに2回入っています。これは、actionSheet:clickedButtonAtIndex:メソッドを2回入力していることを意味します。したがって、メソッドを入力するたびに

letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];

ステートメントが2回実行され、次に2つのオブジェクトが作成されます。これは、ストアからフェッチを実行することで確認できます。

したがって、2つの異なるオブジェクトのプロパティをチェックしているため、null

nil管理対象オブジェクトを1つだけ使用している場合は、実行する前にオブジェクトのチェックを追加できますinsertNewObjectForEntityForName:inManagedObjectContext:。これにより、同じオブジェクトを使用していることが確認されます。
同時に複数のオブジェクトを使用している場合は、オブジェクトIDまたは一意のキーを使用してオブジェクトを識別し、操作します。

編集:
次のコードでnilを確認できます。

if(letsMeet==Nil){
    letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
}

これは、メソッドを呼び出しているオブジェクトactionSheet:clickedButtonAtIndex:が常にメモリ内にある場合にのみ機能します。ただし、永続化しているため、ストアからオブジェクトをフェッチして、いいえを確認することをお勧めします。オブジェクトの。

NSError *error;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext]];
NSArray *objectArray = [managedObjectContext executeFetchRequest:request error:&error]
if(objectArray.count==0){
    letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
}else{
    letsMeet = (LetsMeet *)[objectArray objectAtIndex:0];
}

注: 2、3の変数のみを永続化する必要がある場合、コアデータはやり過ぎかもしれません。代わりにNSUserDefaultsを使用し、シンプルに保ちます。

于 2013-02-21T05:53:38.657 に答える