更改日期未反映在上一个视图中

时间:2013-08-01 12:00:02

标签: ios objective-c

我正在读一些书,我偶然发现了这件事。 在我的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数据结构中,用户可以看到新的日期。但是,如果我将上面的代码更改为以下代码,它将不再起作用,任何线索为什么?

NOT 工作):

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

1 个答案:

答案 0 :(得分: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的情况一样(因为您可以更改内容)。