2013-08-01 46 views
1

我正在讀一些書,我偶然發現了這個東西。 以我的ViewController在用戶點擊時改變以下 代碼日期按鈕被稱爲:更改日期沒有反映在以前的視圖

- (IBAction)changeDate:(id)sender { 

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

    [vc setItem: item]; 

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

} 

item是一個指針指向一個自定義類對象,其具有NSDate *類型的ivar;

現在,裏面DateViewController當用戶已經挑選新的日期,並希望 導航到以前的觀點,我有以下代碼:

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

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

此代碼的工作,當用戶從上面的代碼變化可以追溯到反映 在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的情況。 NSMutableArray就像您通過item(因爲您可以更改內容)的情況。

+0

是的,但'self.userDate'實際上指向'currentItem.dateCreated;' - 不是嗎? (因爲第二個來自最後一個代碼片段的分配)。 – user2054339

+0

它指向同一個對象,但通過在'self'上設置屬性,您不需要編輯原始對象,只需更改屬性所引用的內容即可。 – Wain

+0

即使我將最後一個代碼片段中的行更改爲:'userDate = [datePicker date];'from self.userDate = [datePicker date];' - 當用戶回到此視圖時,currentItem的日期仍未更新。 .. – user2054339