Сохранение даты, выбранной при выходе из UIDatePicker - PullRequest
1 голос
/ 31 августа 2011

Я пытаюсь загрузить дату, выбранную пользователем в последний раз, каждый раз, когда появляется мое представление.

Этот IBAction вызывается, когда мой datePicker меняет значение. datepick - мой datePicker

Я делаю это для сохранения в свойстве rootVC.

- (void)viewWillDisappear:(BOOL)animated {
    BookingViewController *bookingVC = [[BookingViewController alloc] init];
    bookingVC.selectedDate = [datepick date];
    [bookingVC release];
}

Загружайте его каждый раз, когда viewAppears.

- (void)viewWillAppear:(BOOL)animated
{       
    // set datePicker Range.
    NSDate *todaysDate = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    [dateComponents setHour:48];
    NSDateComponents *dateComponents2 = [[NSDateComponents alloc] init];
    [dateComponents2 setMinute:30];
    NSDate *maxDate = [gregorian dateByAddingComponents:dateComponents toDate:todaysDate  options:0];
    NSDate *minDate = [gregorian dateByAddingComponents:dateComponents2 toDate:todaysDate  options:0];
    datepick.maximumDate = maxDate;
    datepick.minimumDate = minDate;
    if (self.dateToSet == nil) {
        [datepick setDate:minDate animated:YES];
    }
    else {
        [datepick setDate:dateToSet animated:YES];
    }
    [dateComponents release];
    [dateComponents2 release];
    [gregorian release];
    choice = [datepick date];   
    choiceString = [dateFormatter stringFromDate:choice];
    dateTextfield.text = choiceString;

}

Перед нажатием dateViewController я передаю сохраненную дату (self.selectedDate) в свойство dateViewController.dateToSet

- (void)advanceBooking:(id) sender {
    DateViewController *dateViewController= [[DateViewController alloc]
                                           initWithNibName:@"DateViewController" 
                                           bundle:nil];
    if (self.selectedDate == nil) {
        selectedDate = [[NSDate alloc] init];
    }
    dateViewController.dateToSet = self.selectedDate;
    NSLog(@"dateVC.dateToSet :%@ selectedDate:%@", dateViewController.dateToSet, self.selectedDate); // both read as current date though it was the first call? weird.
    dateViewController.hidesBottomBarWhenPushed = YES;
    dateViewController.navigationItem.hidesBackButton = YES;
    [self.navigationController pushViewController:dateViewController animated:YES];
    [dateViewController release];

}

Думаю, что-то связано с тем, как я инициализирую свойство? Когда я должен их инициировать?

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

Попробуйте установить parentViewController из datePicker при его создании:

dateViewController.parentViewController = self;

А в методе viewWillDisappear сделать следующее:

((BookingViewController *)self.parentViewController).selectedDate = [datepick date];

В BookingViewController вы должны объявить и синтезировать свойство NSDate *selectedData.

Но для этих целей более правильным является использование протокола + делегирования.

1 голос
/ 31 августа 2011

Каждый раз, когда вы загружаете представление (viewDidLoad), вы переустанавливаете значение на «сейчас».В viewDidLoad вы не должны инициализировать choice.

0 голосов
/ 01 сентября 2011

Поскольку я возвращаюсь по иерархии, мне не следует создавать новый объект класса.

Так что вместо этого я должен вернуть объект, который уже был создан как таковой,

На DateViewController.m (дочерний вид)

NSArray *viewControllers = [self.navigationController viewControllers];
BookingViewController *bookingVC = (BookingViewController *)[viewControllers objectAtIndex:viewControllers.count - 2];
[bookingVC setSelectedDate:[datepick date]];

На BookingViewController.m (родительский вид)

if (self.selectedDate != nil) {
    dateViewController.dateToSet = self.selectedDate;
}

Затем установите его каждый раз во время viewDidLoad на DateViewController.m

if (self.dateToSet == nil) {
    [datepick setDate:minDate animated:YES];
}
else {
    [datepick setDate:dateToSet animated:YES];
}
...