1

很抱歉问了这么一个微不足道的问题。我是 Objective-C 的新手,在尝试了几种可能的方法并在谷歌搜索之后,根本看不到如何让它工作。请帮忙!我的问题很简单。我有一个类级别的 NSDate 对象,它在类中的任何方法之外声明为:

NSDate *fromDate;

现在,在一个方法中,将此值设置为 DatePicker 中的日期:

fromDate = [datePicker date];

完成上述任务后不久,我将它的值打印到日志中并且它工作正常。

NSLog(@"From Date: %@", fromDate);

现在,当我在另一种/不同的方法中使用 NSDate 的值时,该值消失了!为什么它不在同一个类本身的方法之间持久化?我该怎么做才能跨方法访问该值?


感谢您的回复。

嗨,雷米,

  1. 我不知道 Objective-C 没有类级别的变量!感谢您指出!

  2. 是的,我已经将项目(在 Xcode 中)设置为 ARC(所以,我认为应该小心)。

  3. 这是代码:

在 ViewController.h

....
....
@property (nonatomic, retain) NSDate *historyFromDate;
@property (nonatomic, retain) NSDate *historyToDate;
....
....
-(IBAction) fromDateChosen: (id)sender;
-(void) fetchTheHistory;

在 ViewController.m 中

...
...
@synthesize historyFromDate;
@synthesize historyToDate;
....
....

-(IBAction) fromDateChosen: (id)sender {

NSString *buttonTitle = @"I've chosen the 'FROM' date";

if ([[buttonDateChosen currentTitle] isEqualToString:buttonTitle]) { 

    NSLog(@"User has chosen the 'From' date");

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];

    // Get the chosen date value
    NSDate *fromDate = [datePicker date];
    historyFromDate = fromDate;



    // Set the 'to' date label to reflect the user's choice
    labelFromDate.text = [dateFormatter stringFromDate:historyFromDate];
    NSLog(@"'From' Date Chosen:%@", historyFromDate);
          //[dateFormatter stringFromDate:[datePicker date]]);

    [self fetchTheMoodHistory];
}
}
...
...
...

-(void) fetchTheHistory {

NSLog(@"Calling fetchTheHistory for the period from %@", historyFromDate);
...
...
}

...
...

在用户从 UI 中的 Date Picker 对象中选择日期后,将调用fromDateChosen 。在方法“ fromDateChosen ”中,当我打印historyFromDate时,该值是正确的。但是,当我在fetchTheHistory方法中打印它时,该值显示当前日期/时间(不是用户选择的日期/时间)。

4

2 回答 2

0

尝试将 fromDate 变量放在类范围内,例如:

@implementation ViewController
{
    NSDate *fromDate;
}
于 2013-01-25T00:34:57.020 回答
0

的日期属性UIDatePicker由该类保留,只要日期选择器本身在范围内且有效(未发布),就可以访问。您将此日期值存储在一个变量中,但自己不保留它,因此当日期选择器超出范围时,您将丢失该值。作为快速修复,请改为执行此操作;

fromDate = [[datePicker date] retain];

现在,这不是最好的方法,您确实应该将日期作为使用此信息的任何类的属性。

于 2012-04-19T17:51:23.473 回答