UITextField slaat geen tekst op

Ik heb een weergave met verschillende UITextFields erin. Ik heb ook een hoge UISegmentController die de weergave verandert. Wanneer ik tekst in een veld invoeg, druk dan op de toetsenbordtoets verbergen, wijzig dan segmenten, het bespaart prima. Maar als ik tekst invoer en niet op de knop voor het vrijgaveklavier druk, wissel dan van segment, het slaat de tekst niet op.

Hoe kan ik dit oplossen?

Hier is een deel van de code voor de UITextField in mijn aangepaste UITableViewCell :

- (IBAction)col2_doubleValueChanged:(id)sender
{
    NSString *newValue = [NSString stringWithFormat:@"%@/%@", self.col2_doubleEntryValue_1.text, self.col2_doubleEntryValue_2.text];
    NSMutableDictionary *result = [[[NSMutableDictionary alloc] init] autorelease];
    [result setValue:self.row_key forKey:@"row_key"];
    [result setValue:@"1" forKey:@"column"];
    [result setValue:newValue forKey:@"col2_value"];
    [[self delegate] editDidFinish:result];
    [[self delegate] valueChanged];
}

- (IBAction)col2_singleValueEditDidBegin:(id)sender
{
}

enter image description here

Bewerk:

- (void)valueChanged
{
    self.dirtyFlag = 1;
}

- (int)saveDataToServer
{
    [self.tableView resignFirstResponder];

    if (!dirtyFlag) {
        return 0;
    }    

    NSString *errors = [DataSource updatePatientWorkflowClinicalChecklistForAppointment:[[[DrChronoDataSource getCurrentAppointment] valueForKey:@"appointment_id"] intValue] clinicalInfo:self.clinicalChecklist checklistId:[self.clinicalChecklistId intValue] patientWorkflowServerId:patientWorkflowServerId];

    if ((NULL == errors) || ![errors isEqualToString: @""]) {
        //Show error messages.
        if (NULL == errors) {
            errors = @"Failed to save data to server.  Please retry.";
        }
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Status" message:errors delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];
        return -1;
    } else {
        [self dismissModalViewControllerAnimated:FALSE];
    }

    self.dirtyFlag = 0;
    return 0;
}
1
U moet de code opgeven die u gebruikt om de tekst af te handelen en op te slaan
toegevoegd de auteur eric.mitchell, de bron
Meer code toegevoegd aan vraag.
toegevoegd de auteur Jon, de bron

3 antwoord

U hebt geen schrijffuncties.

- (IBAction)col2_doubleValueChanged:(id)sender
{
    NSString *newValue = [NSString stringWithFormat:@"%@/%@", self.col2_doubleEntryValue_1.text, self.col2_doubleEntryValue_2.text];
    NSMutableDictionary *result = [[[NSMutableDictionary alloc] init] autorelease];
    [result setValue:self.row_key forKey:@"row_key"];
    [result setValue:@"1" forKey:@"column"];
    [result setValue:newValue forKey:@"col2_value"];

    /* your aren't writing the new data anywhere, 
       you need to add something like this: 
     */

    [result writeToFile: @"somefile.txt" atomically: YES];

    [[self delegate] editDidFinish:result];
    [[self delegate] valueChanged];
}
1
toegevoegd
Dat gedeelte van de code was niet beschikbaar toen ik mijn antwoord postte.
toegevoegd de auteur WrightsCS, de bron
probeer de broncode updatePatientWorkflowClinicalChecklistForAppointment te plaatsen, omdat geen van de code die u hebt gepost laat zien hoe u gegevens "opslaat", waar u deze opslaat, noch waarom het niet zou opslaan.
toegevoegd de auteur WrightsCS, de bron
Probeer uw textField als een object toe te voegen, in plaats van alleen IB. Wijs de IBOutlet naar uw textField en vermeld het ergens in uw code. Gebruik ook NSLog om op elk punt te zien wat de waarde van het textField is. Hoogstwaarschijnlijk zal het helemaal null zijn.
toegevoegd de auteur WrightsCS, de bron
De methode valueChanged activeert een methode in een andere klasse met de naam - (int) saveDataToServer waarmee de gegevens worden opgeslagen. Alles werkt goed als ik het toetsenbord loslaat met de knop, maar soms gebruikt het niet om het te drukken en alleen van weergave te veranderen, zodat de tekst dan niet wordt opgeslagen. Ik heb deze methode toegevoegd aan de vraag
toegevoegd de auteur Jon, de bron
Ja, ik heb het zojuist toegevoegd.
toegevoegd de auteur Jon, de bron
Al die methode doet de gegevens doorgeven aan de server. Die methode is prima, het probleem is dat de tekst in het tekstveld niet wordt opgeslagen, daarom wordt het niet doorgegeven aan die methode als het toetsenbord niet wordt vrijgegeven.
toegevoegd de auteur Jon, de bron

Zou je beide gebeurtenissen niet aan dezelfde actie kunnen koppelen? Misschien kun je een BOOL maken in je headerbestand met de naam needsSaving. Stel deze in op NEE elke keer dat het bewerken begint, en dan JA telkens als de gegevens succesvol zijn opgeslagen. Voer dan alleen de body van uw opslagmethoden uit als de benodigde besparing NEEN is, dat onnodige besparingen zal voorkomen. Ik denk dat als je dit doet, dit de functie van je app zou vereenvoudigen. d.w.z.

- (IBAction)col2_singleValueEditDidBegin:(id)sender {
    needsSaving = YES;
}

- (int)saveDataToServer
{
    [self.tableView resignFirstResponder];

    if (!dirtyFlag || !needsSaving) {
        return 0;
    }

    NSString *errors = [DataSource updatePatientWorkflowClinicalChecklistForAppointment:[[[DrChronoDataSource getCurrentAppointment] valueForKey:@"appointment_id"] intValue] clinicalInfo:self.clinicalChecklist checklistId:[self.clinicalChecklistId intValue] patientWorkflowServerId:patientWorkflowServerId];

    if ((NULL == errors) || ![errors isEqualToString: @""]) {
        //Show error messages.
        if (NULL == errors) {
            errors = @"Failed to save data to server.  Please retry.";
        }
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Status" message:errors delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];
        return -1;
    } else {
        needsSaving = NO;
        [self dismissModalViewControllerAnimated:FALSE];
    }

    self.dirtyFlag = 0;
    return 0;
}
0
toegevoegd

Het lijkt erop alsof je de UITextFieldDelegate niet implementeert prototocols.

0
toegevoegd
Dat wil zeggen, niet helemaal :)
toegevoegd de auteur jstevenco, de bron