This question has been bugging me a LOT lately. Any help would be appreciated.
These were my objectives:
You don't need to instantiate multiple instances of UIDatePicker
. One should do. Assign it to all the text fields. Now to update the text field, you will have to identify which text field is being updated. For this you should adopt the UITextFieldDelegate
protocol and implement the textFieldDidBeginEditing:
method to set the active text field. Now, when the value is changed on the UIDatePicker
instance, update the active text field.
But this is sadly not enough. You will face a problem with cell reuse. To counter this, you will have to maintain an array of dates for each of your rows and update the array every time the value is changed on the UIDatePicker
instance. You can identify which cell the text field belongs to by either tag
ging it or by getting the superview which would be a UITableViewCell
instance and then calling indexPathForCell:
method on the UITableView
.
And on a side note, return (label.text); [df release];
is wrong as the method will return prior to df
being release
d. You should swap the order there.
This is just a follow up to a flurry of comments on the accepted solution. Thank you all for your help. To make this work, the sample code is as follows:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
textFieldThatWillBeUpdatedByTheUIDatePicker = (UITextField *)textField;
}
Where textFieldThatWillBeUpdatedByTheUIDatePicker
is declared as a UITextField
in the header file.
Finally, here is the method that changes the cell:
- (NSString *)datePickerValueChanged:(UIDatePicker*) datePicker{
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
textFieldThatWillBeUpdatedByTheUIDatePicker.text = [NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]];
}
To handle cell reuse, do what @Deepak said with regards to an array you can use this line:
[dateArray replaceObjectAtIndex:textFieldThatWillBeUpdatedByTheUIDatePicker.tag withObject:[NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]]];
Where the tag
is set in cellForRowAtIndexPath
like this:
textField.tag = indexPath.row;
I'm assuming that the dateArray
is pre-populated and prior to the table view getting called for the first time either with real dates or blank values. If you try to replace something that isn't there it is going to fail obviously.
Finally, when the UIDatePicker
is being built in cellForRowAtIndexPath
include this line to handle the cell reuse:
textField.text = [dateArray objectAtIndex:indexPath.row];
The first time around it may be blank or pre-populated with a date.