论存取方法的重要性——在多个视图控制器之间传递数据
今天在做练习时,遇到一道习题,描述的情况是:导航控制器下控制着三个子视图控制器,分别是列表视图,详情视图以及一个含有UIDatePicker控件的视图。
列表视图显示所有的项目,详情视图相识某一个项目的详情,最后一个含有控件的视图提供修改项目日期的功能。
要修改日期,就需要在控制器之间传递数据,数据由列表视图开始,已经传递至详情视图,现在要将其继续传递到含有日期控件的视图,为此,我为最后一个视图创建了NSDate属性,并编写了动作方法,将日期控件所选择的日期赋给NSDate属性,代码如下:
RAPDatePickerVC.h
#import <UIKit/UIKit.h>
@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已经是调整过的日期,这就说明是数据的传递出现了问题。
原因:
RAPDatePickerVC
的date
属性所指向的NSDate对象(即修改后的日期)和项目的日期属性所指向的根本不是同一个对象。也就是说,在confirmDateChange
中
datex = self.datePicker.date;
这行代码并没有起到正确设置项目日期的作用,因为想要设置一个对象的属性,必需使用存取方法,单单传递一个属性的值,也许在向下传递时没有问题,但是想要将修改过的数据回传,就会发生问题,因为如果传递的不是整个对象,就会因为不能使用存取方法,而不能将数据回传。所以,在下面的代码中,我就将原始项目的模型对象设置为RAPDatePickerVC
的属性,并利用存方法将日期空间所选择的值赋给项目模型的日期属性。
RAPDatePickerVC.h
#import <UIKit/UIKit.h>
@class RAPItem;
@interface RAPDatePickerVC : UIViewController
@property (nonatomic, strong) RAPItem *itemx;
@end
RAPDatePickerVC.m
- (IBAction)confirmDateChange:(id)sender
{
[self.itemx setDateCreated:self.datePicker.date];
}