论存取方法的重要性——在多个视图控制器之间传递数据

论存取方法的重要性——在多个视图控制器之间传递数据

今天在做练习时,遇到一道习题,描述的情况是:导航控制器下控制着三个子视图控制器,分别是列表视图,详情视图以及一个含有UIDatePicker控件的视图。

列表视图显示所有的项目,详情视图相识某一个项目的详情,最后一个含有控件的视图提供修改项目日期的功能。

要修改日期,就需要在控制器之间传递数据,数据由列表视图开始,已经传递至详情视图,现在要将其继续传递到含有日期控件的视图,为此,我为最后一个视图创建了NSDate属性,并编写了动作方法,将日期控件所选择的日期赋给NSDate属性,代码如下:

RAPDatePickerVC.h

#import 

@class RAPItem;

@interface RAPDatePickerVC : UIViewController

@property (nonatomic, strong) NSDate *date;

@end

RAPDatePickerVC.m

@interface RAPDatePickerVC ()

@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;

@end

@implementation RAPDatePickerVC
......

// 实现文件中的动作方法,将日期控件的日期赋给self.date
- (IBAction)confirmDateChange:(id)sender 
{
    NSDate *datex = self.date;
    datex = self.datePicker.date;
}

@end

然而,上面代码并不能将项目的日期正确设置,经过验证,在上面的confirmDateChange:方法中,datex已经是调整过的日期,这就说明是数据的传递出现了问题。

原因:

RAPDatePickerVCdate属性所指向的NSDate对象(即修改后的日期)和项目的日期属性所指向的根本不是同一个对象。也就是说,在confirmDateChange

    datex = self.datePicker.date;

这行代码并没有起到正确设置项目日期的作用,因为想要设置一个对象的属性,必需使用存取方法,单单传递一个属性的值,也许在向下传递时没有问题,但是想要将修改过的数据回传,就会发生问题,因为如果传递的不是整个对象,就会因为不能使用存取方法,而不能将数据回传。所以,在下面的代码中,我就将原始项目的模型对象设置为RAPDatePickerVC的属性,并利用存方法将日期空间所选择的值赋给项目模型的日期属性。

RAPDatePickerVC.h

#import 

@class RAPItem;

@interface RAPDatePickerVC : UIViewController

@property (nonatomic, strong) RAPItem *itemx;

@end

RAPDatePickerVC.m

- (IBAction)confirmDateChange:(id)sender
{
    [self.itemx setDateCreated:self.datePicker.date];
}

你可能感兴趣的:(论存取方法的重要性——在多个视图控制器之间传递数据)