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:

  1. 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 sortie

affiche 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
4
demandé sur csano 2011-06-02 01:46:23

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.

9
répondu Deepak Danduprolu 2011-06-01 22:09:41

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;

}

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.

1
répondu AngeloS 2011-06-06 22:02:21