2009-04-06 2 views
2

In einer Mac OS X Cocoa-Anwendung habe ich ein anwendungs-modales Dialogfeld mit Textfeldern, die an den gemeinsamen Benutzer-Defaults-Controller gebunden sind. Wenn ich ein Textfeld bearbeite und dann wegklicke, bevor ich auf OK klicke, funktioniert alles wie gewünscht. Wenn ich jedoch anfange, ein Feld zu bearbeiten, und dann die Return-Taste drücke, um OK auszulösen, bleibt der alte Wert des Feldes in NSUserDefaults.Erzwingen des Lesens eines Textfeldes vor dem Beenden des Modal-Dialogs in Cocoa

Also, wie kann ich das geänderte Feld zwingen, den gebundenen Wert zu beeinflussen, wenn die Bearbeitung "unvollständig" ist?

Aus der Durchsicht der Dokumentation, ich denke, ich könnte NSControl validateEditing-Methode für jedes der Textfelder vor dem Schließen des Dialogfelds aufrufen, aber es scheint wie es sollte ein einfacher Weg sein.

FWIW, hier ist der Code, der den Dialog zeigt:

- (void)showDialog { 
    [NSApp activateIgnoringOtherApps:YES]; 
    [NSApp beginSheet:startTimerDialog 
     modalForWindow:nil 
     modalDelegate:nil 
     didEndSelector:nil 
      contextInfo:nil]; 
    [NSApp runModalForWindow:startTimerDialog]; 
    [NSApp endSheet:startTimerDialog]; 
    [startTimerDialog orderOut:self]; 
} 

Die OK-Taste (eigentlich den Titel "Start") zu dieser Methode abgezielt wird:

- (IBAction)startTimerDialogStartButtonWasClicked:(id)sender { 
    [self closeModalDialog:sender]; 

    // Then, call methods that read values from NSUserDefaults 
    // ...  
} 

Antwort

4

Senden Sie dem Benutzer Standard-Controller eine commitEditing Nachricht.

0

Sie könnten versuchen, eine Einstellung delegate für alle Ihre Textfelder und haben Änderungen direkt behandelt.

+0

Erhält der Delegierte eine Benachrichtigung in dem Fall, den ich versuche zu behandeln? –

2

Dies könnte die Antwort sein:

[startTimerDialog makeFirstResponder:nil]; 

die Dokumentation nach, dies sendet ResignFirstResponder zu, was auch immer ist derzeit der Ersthelfer, die die Bearbeitung beenden führen sollte.

Natürlich kann der Ersthelfer den Rücktritt ablehnen, in diesem Fall wird der firstResponder NO zurückgeben. Also muss ich schauen, wie ich damit umgehen soll.

1

Eine etwas abrupte Art und Weise der Bearbeitung zu beenden kann mit folgendem Aufruf erreicht werden:

[startTimerDialog endEditingFor:nil]; 

Dies gilt immer, aber es ist ein bisschen intensiver als Sie die meiste Zeit benötigen. (für eine offizielle Beschreibung von "intensiv" siehe den Dokumentationslink unten).

Kurz gesagt: -endEditingFor: sollte nur als letzter Ausweg verwendet werden, wenn Sie den FieldEditor nicht zum Rücktritt vom First Responder bringen können. Vielleicht möchten Sie einen subtileren Ansatz versuchen, bevor Sie zu den extremen Maßnahmen wie diesem greifen.

subtiler zu sein, in den NSWindow class documentation für -endEditingFor: von Apple schlägt dies so etwas wie:

if (![startTimerDialog makeFirstResponder:startTimerDialog]) 
    /* Making the window firstResponder failed, proceed to 
     force the first responder to resign */ 

    [startTimerDialog endEditingFor:nil]; 

den Link oben Folgen ihren genauen Beispiel-Code zu sehen, ich es verkürzt hier, weil du bist offensichtlich nicht daran interessiert, den fieldEditor danach in Ihrem beschriebenen Anwendungsfall zu verwenden.

Verwandte Themen