有一个属性指向另一个属性

时间:2010-11-14 08:19:27

标签: iphone objective-c pointers properties

在我的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值。

2 个答案:

答案 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}对象。