2013-02-21 12 views
0

하나의 변수 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 

질문 : 표시 letsMeet.startTimeLabel 것입니다 왜 처음 수정 및 종료 시각을 선택한 후에는 NULL로 변경됩니다. EndTime은 prepareForSegue까지 올바른 값을 계속 보여줍니다. 기묘한!

+0

다른 인스턴스이기 때문에. – Rog

+0

무엇을 의미합니까? 또한 PrepareForSegue에서 두 변수 모두에 대해 NSLog를 수행했으며 EndTime이 올바른 값으로 표시되면 StartTime이 NULL로 표시됩니다. 코드와 로그를 업데이트했습니다. – user1107173

답변

1

로그 및 코드에 따라 스위치 블록을 두 번 입력합니다. 즉, actionSheet:clickedButtonAtIndex: 메소드를 두 번 입력한다는 의미입니다. 그래서 때마다 두 개의 객체를 생성 차례로,

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

문을 두 번 실행 방법을 입력합니다. 상점에서 가져 오기를 수행하여이를 볼 수 있습니다.

두 개의 서로 다른 개체에서 속성을 확인하므로 null입니다.

관리 대상 개체를 하나만 사용하는 경우 insertNewObjectForEntityForName:inManagedObjectContext:을 실행하기 전에 개체에 대해 nil에 대한 검사를 추가 할 수 있습니다. 이렇게하면 동일한 객체를 사용하고 있는지 확인할 수 있습니다.
동시에 두 개 이상의 객체를 사용하는 경우 객체 ID 또는 고유 한 키를 사용하여 객체를 식별하고 조작합니다.

편집 :
다음과 같은 코드 전무를 확인할 수 있습니다 : 이것은에만 작동합니다

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

, 오브젝트 당신이 actionSheet:clickedButtonAtIndex: 방법은 메모리에 항상 호출하는 경우. 그러나 당신이 계속하고 있기 때문에 저장소에서 객체를 꺼내고 no를 체크 할 수 있습니다. 개체.

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]; 
} 

참고 : 변수의 몇 가지를 유지해야하는 경우, 코어 데이터가 과잉 될 수 있습니다. NSUserDefaults를 대신 사용하고 간단하게 유지하십시오.

+0

답장을 보내 주셔서 감사합니다. 하나의 managedObject 만 사용하고 있습니다. 나에게 동일한 managedObject를 사용하고 있는지 확인하기 위해 nil을 검사하는 방법에 대한 예제를 알려주시겠습니까? – user1107173

+0

개체를 한 번만 만듭니다. 나는 나의 대답을 업데이트했다. – Rakesh

+0

나는 nil을 확인하려했지만 작동하지 않았다. 나는 if 문에서 NSLog를 수행 했으므로 결코 실행되지 않습니다. StartTime과 EndTime에 대한 NSLog는 모두 NULL로 표시됩니다. 그런 다음 가져 오기 코드를 시도했습니다. 그리고 똑같은 일이 일어납니다. if 문 내부의 NSLog도 실행되지 않습니다. if 문을 건너 뛰는 이유가 확실하지 않습니다. 나는 ViewDidLoad 내에서 두 코드를 모두 움직이려고 시도하고 같은 결과를 얻었습니다. ObjectID를 사용해야합니까? 고유 한 ObjectID를 얻는 방법을 모르겠습니다.감사합니다 – user1107173

관련 문제