2013-08-01 3 views
1

일부 책을 읽고 있는데이 문제가 발생했습니다. 사용자가 클릭이 코드 다음 날짜 버튼을 변경 제의 ViewController에서 가 호출됩니다 :변경 날짜가 이전보기에 반영되지 않았습니다.

- (IBAction)changeDate:(id)sender { 

    DateViewController *vc = [[DateViewController alloc] init]; 

    [vc setItem: item]; 

    [[self navigationController] pushViewController:vc animated:YES]; 

} 

item 유형 NSDate *의 바르가있는 사용자 정의 클래스 객체에 대한 포인터입니다;

- (void)viewWillDisappear:(BOOL)animated 
{ 
    NSLog(@"%@", [datePicker date]); 

    item.dateCreated = [datePicker date]; // get selected date 
} 

이 코드는 작동하고 사용자가 코드 변경 위에서 되돌아 갈 때 을 반영 : 사용자가 이미 새로운 날짜를 포착하고 이전보기로 이동합니다 를 원 DateViewController 안에, 내가 다음 코드 한 지금

, item 데이터 구조와 사용자는 새로운 날짜를 볼 수 있습니다. 그러나 위의 코드를 다음 코드로 변경하면 더 이상 작동하지 않습니다.

- (IBAction)changeDate:(id)sender { 

    DateViewController *vc = [[DateViewController alloc] init]; 

    vc.userDate = currentItem.dateCreated; 

    [[self navigationController] pushViewController:vc animated:YES]; 

} 

DateViewController : 당신이 그것을 포함 된 날짜를 변경할 수 있기 때문에 첫 번째 경우에

- (void)viewWillDisappear:(BOOL)animated 
{ 
    NSLog(@"%@", [datePicker date]); 

    self.userDate = [datePicker date]; 
} 

답변

0

item는, 변경 가능한 인스턴스

는 (이 하지 작업을 수행합니다). 두 번째 경우에는 NSDate 자체를 제공하며 이는 변경할 수 없습니다.

첫 번째 경우에 item에 대한 참조를 전달하며이 편집은 나중에 편집 할 수 있으며 나중에 편집 할 수 있습니다.

그러나 두 번째 경우는 원래 날짜를 편집하지 않고, 해제 된 중간에있는보기 컨트롤러의 속성에 선택한 날짜 만 저장합니다.

일반적으로 통신을 명확하게하는 것이 좋습니다. 따라서보기 컨트롤러는 위임을 통해 선택한 날짜를 호출자에게 다시 전달하거나 선택을 한 후에 쿼리 할 수있는 속성 (두 번째 경우와 같이)을 제공합니다. 첫 번째 옵션은 두 번째보기 컨트롤러가 표시되는 동안 인스턴스 item을 공유하여 데이터 교환을 효과적으로 숨길 수 있습니다.


변경할 수 없다는 것은 개체 자체 (내용)를 변경할 수 없음을 의미합니다. 개체에 대한 참조가 변경되는 것을 막지는 않습니다. 우리가 보여 (불변의 버전을 변경할 수 있습니다) 배열을 사용하는 경우 :

NSArray *a = [NSArray array]; 
NSArray *b = a; 
[b editSomething]; // illegal (not a true method name but just an example of something you might want to try) 
b = nil; // just nils b, no affect on a at all 

그리고

NSMutableArray *a = [NSArray array]; 
NSMutableArray *b = a; 
[b addObject:@"String"]; // edits a, because a and b are the same object 
b = nil; // just nils b, no affect on a at all 

NSArray은 그냥 NSDate을 통과 상황과 같다. NSMutableArrayitem을 전달한 것과 같습니다 (내용을 변경할 수 있으므로).

+0

네,하지만'self.userDate'는 실제로'currentItem.dateCreated;를 가리 킵니다 - 그렇지 않습니까? (두 번째 - 마지막 코드 스 니펫에서 할당 때문에). – user2054339

+0

그것은 동일한 객체를 가리 키지 만, 'self'에 속성을 설정하면 원본을 편집하지 않고 속성이 참조하는 내용 만 변경하면됩니다. – Wain

+0

마지막 코드 조각의 줄을'user.userDate = [datePicker date];'self.userDate = [datePicker date];에서'userDate = [datePicker date];'로 변경하더라도 사용자가이보기로 돌아올 때 currentItem의 날짜는 여전히 업데이트되지 않습니다. .. – user2054339

관련 문제