UIDatePicker dans UITextField dans UITableView mise à jour en temps réel
cette question m'ennuie beaucoup ces derniers temps. Toute aide serait appréciée.
tels étaient mes objectifs:
- Installation d'un UIDatePickerView pour un UItextField dans un UITableViewCell.
j'ai fait tout cela jusqu'à présent, et je peux voir le cueilleur travailler très bien. Chaque fois que je change la valeur de picker, J'utilise NSLog pour afficher la valeur actuelle et il fonctionne bien pour chaque changement.
C'est ce que je veux: * * chaque fois que je change la pickervalue, j'ai besoin que la valeur soit aussi changée automatiquement dans le champ UITextField (qui est dans la cellule Uitable Viewcell)**
C'est mon code CellForRowIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(110, 10, 185, 30)];
textField.clearsOnBeginEditing = YES;
textField.textAlignment = UITextAlignmentRight;
[cell.contentView addSubview:textField];
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicker.datePickerMode = UIDatePickerModeDate;
[datePicker addTarget:self action:@selector(datePickerValueChangedd:) forControlEvents:UIControlEventValueChanged];
datePicker.tag = indexPath.row;
textField.inputView = datePicker;
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
NSString *local;
local = [self datePickerValueChangedd: datePicker];
NSLog(@"%@", local); //DISPLAYS OUTPUT ONCE
textField.text =local;
[datePicker reloadInputViews];
[datePicker release];
// Configure the cell...
NSInteger row = [indexPath row];
cell.textLabel.text = [doseInfoDetailsArray objectAtIndex:row];
return cell;
}
je poste aussi un autre code ci-dessous.
- (NSString *)datePickerValueChangedd:(UIDatePicker*) datePicker{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 50, 68, 68)];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
label.text = [NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]];
NSLog(@"%@", label.text); // DISPLAYS OUTPUT WHENEVER PICKER IS MOVED
doseInfoDetailsTable.reloadData;
return (label.text);
//[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(t) name:TestNotification object:label];
[df release];
}
La sortieaffiche correctement. Mais j'en ai besoin pour changer dans le champ Uitext.
2011-06-01 17:32:23.740 Tab[13857:207] Jun 1, 2017
2011-06-01 17:32:23.740 Tab[13857:207] Jun 1, 2017
2011-06-01 17:32:25.321 Tab[13857:207] Dec 1, 2017
2011-06-01 17:44:51.453 Tab[13857:207] Jun 1, 2017
2011-06-01 17:44:52.605 Tab[13857:207] Jun 1, 2018
2011-06-01 17:44:53.467 Tab[13857:207] Jun 2, 2018
2011-06-01 17:44:54.247 Tab[13857:207] Jun 5, 2018
2 réponses
Vous n'avez pas besoin d'instancier plusieurs instances de UIDatePicker
. On devrait faire. L'attribuer à tous les champs de texte. Maintenant, pour mettre à jour le champ de texte, vous devrez identifier le champ de texte qui est mis à jour. Pour cela, vous devez adopter le protocole UITextFieldDelegate
et mettre en œuvre la méthode textFieldDidBeginEditing:
pour définir le champ de texte actif. Maintenant, lorsque la valeur est changée sur l'instance UIDatePicker
, mettez à jour le champ de texte actif.
Mais ce n'est malheureusement pas suffisant. Vous aura un problème avec la réutilisation des cellules. Pour contrer cela, vous devrez maintenir un tableau de dates pour chacune de vos lignes et mettre à jour le tableau chaque fois que la valeur est changée sur l'instance UIDatePicker
. Vous pouvez identifier la cellule à laquelle le champ de texte appartient soit par tag
ging soit en obtenant la superview qui serait une instance UITableViewCell
et puis en appelant indexPathForCell:
méthode sur le UITableView
.
et sur une note latérale, return (label.text); [df release];
est erroné car le méthode retournera avant df
étant release
D. Vous devriez échanger la commande là-bas.
ce n'est qu'une suite à une série de commentaires sur la solution acceptée. Merci à vous tous pour votre aide. Pour ce faire, le code de l'échantillon est le suivant:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
textFieldThatWillBeUpdatedByTheUIDatePicker = (UITextField *)textField;
}
où textFieldThatWillBeUpdatedByTheUIDatePicker
est déclaré comme UITextField
dans le fichier d'en-tête.
enfin, voici la méthode qui change la cellule:
- (NSString *)datePickerValueChanged:(UIDatePicker*) datePicker{
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
textFieldThatWillBeUpdatedByTheUIDatePicker.text = [NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]];
}
pour gérer la réutilisation des cellules, Faites ce que @Deepak a dit à propos d'un tableau que vous pouvez utiliser ligne:
[dateArray replaceObjectAtIndex:textFieldThatWillBeUpdatedByTheUIDatePicker.tag withObject:[NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]]];
où le tag
est placé dans cellForRowAtIndexPath
comme ceci:
textField.tag = indexPath.row;
je suppose que le dateArray
est pré-rempli et avant la vue de la table être appelé pour la première fois soit avec des dates réelles ou des valeurs en blanc. Si vous essayez de remplacer quelque chose qui n'est pas là, il ne va pas évidemment.
enfin, lorsque le UIDatePicker
est construit dans cellForRowAtIndexPath
inclure ce ligne pour gérer la réutilisation de la cellule:
textField.text = [dateArray objectAtIndex:indexPath.row];
La première fois, il peut être vide ou pré-rempli avec une date.