代码之家  ›  专栏  ›  技术社区  ›  jonjbar

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

  •  1
  • jonjbar  · 技术社区  · 15 年前

    在我的iPhone项目中,我有一个常见的“日期编辑”视图,其中包含一个uidatepicker。我想使用此视图根据调用方式更新一个nsdate属性。

    我想实现这一点的方法是拥有一个名为currentlyEditedDate的nsDate属性,我将其设置为指向我可以编辑的正确nsDate属性。但我不知道怎么做。

    假设我定义了两个nsdate属性:

    @property (nonatomic, retain) NSDate *startDate;
    @property (nonatomic, retain) NSDate *endDate;
    

    启动视图时,我希望执行以下操作:

    CurrentlyEditedDate = startDate
    

    或基于呼叫者的以下内容:

    CurrentlyEditedDate = endDate
    

    以便我的视图可以编辑任何nsdate对象。但是,我不知道如何定义或分配CurrentlyEditedDate属性。我也不知道如何从视图设置为新的nsdate值。

    2 回复  |  直到 15 年前
        1
  •  3
  •   atticus    15 年前

    我认为实际上这里最好的解决方案是实现委托协议。它看起来有点棘手,但它不会像尝试存储变量引用那样脆弱。

    你需要做的是:

    首先,声明协议,以便其他类知道要实现什么来接收委托消息。另外,创建一个.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;
        }
    }
    

    我只是在没有编译的情况下输入,但应该是正确的。这似乎是一个很大的工作,但它将很快成为第二天性,是一个更强大的方式来处理这些情况。

        2
  •  1
  •   Chris Cooper    15 年前

    你只要打电话给 setCurrentlyEditedDate:(NSDate* date) 由于创建属性而存在的方法。

    [myDateViewController setCurrentlyEditedDate: startDate];
    

    如果在为日期选取器创建和初始化视图控制器的位置调用此函数,它将为 NSDate 属性(已经是指针)指向 startDate 新西兰 对象。