在我的iPhone项目中,我有一个共同的"日期编辑"查看具有UIDatePicker的功能。我想使用此视图根据其调用的方式更新一个NSDate属性。
我想要实现的方法是有一个名为CurrentlyEditedDate的NSDate属性,我将其设置为指向我想编辑的正确NSDate属性。但我不知道该怎么做。
我们说我定义了2个NSDate属性:
@property (nonatomic, retain) NSDate *startDate;
@property (nonatomic, retain) NSDate *endDate;
当我发布视图时,我想执行以下操作:
CurrentlyEditedDate = startDate
或以下基于来电者:
CurrentlyEditedDate = endDate
这样我的视图就可以编辑任何NSDate对象。但是,我不知道如何定义或分配CurrentlyEditedDate属性。我也不知道如何将它从视图设置为新的NSDate值。
答案 0 :(得分:3)
我认为这里最好的解决方案是实现委托协议。它看起来有点棘手,但它不会像试图存储变量引用一样脆弱。
以下是您需要做的事情:
首先,声明协议,以便其他类知道要实现什么以接收您的委托消息。另外,创建一个.delegate属性,以便其他对象可以告诉您的日期选择器他们想要获取这些消息:
// MyDatePicker.h
#import <Cocoa/Cocoa.h>
@class MyDatePicker;
@protocol MyDatePickerDelegate <NSObject>
- (void)myDatePicker:(MyDatePicker *)datePicker didChangeDate:(NSDate *)date;
@end
@interface MyDatePickerViewController : UIViewController {
id<MyDatePickerDelegate> delegate;
}
@property (nonatomic, assign) id<MyDatePickerDelegate> delegate;
@end
然后,当您从选择器中获取新日期时,您只需要检查是否有委托,并且他们已经实施了您的方法。如果有,请继续告诉他们新的日期:
// MyDatePickerViewController.m
#import "MyDatePickerViewController.h"
@implementation MyDatePickerViewController
- (void)changedDate:(NSDate *)newDate {
if ([delegate respondsToSelector:@selector(myDatePicker:didChangeDate:)]) {
[delegate myDatePicker:self didChangeDate:newDate];
}
}
@end
然后,在您想要接收日期信息的班级中,您可以执行以下操作:
- (void)createDatePicker {
MyDatePicker *datePicker = [[MyDatePicker alloc] init];
datePicker.delegate = self;
}
- (void)myDatePicker:(MyDatePicker *)datePicker didChangeDate:(NSDate *)date {
if (startTimeOrSomething) {
self.startDate = date;
} else {
self.endDate = date;
}
}
我只是在没有编译的情况下键入,但它应该是正确的。这可能看起来很多工作,但很快就会成为第二天性,并且是处理这类情况的更强大的方法。
答案 1 :(得分:1)
您只需要调用由于创建属性而存在的setCurrentlyEditedDate:(NSDate* date)
方法。
[myDateViewController setCurrentlyEditedDate: startDate];
如果您在为日期选择器创建和初始化视图控制器的地方调用它,它将指定NSDate
属性(已经是指针)指向startDate
{{1}对象。