Re: return press and edit text
Re: return press and edit text
- Subject: Re: return press and edit text
- From: Quincey Morris <email@hidden>
- Date: Wed, 30 Nov 2016 13:04:17 -0800
- Feedback-id: 167118m:167118agrif8a:167118sBCuVHDcv3:SMTPCORP
On Nov 30, 2016, at 10:41 , J.E. Schotsman <email@hidden> wrote:
>
> a hit on return acts on both the default button and a text field that is being edited in the same window.
>
> The text field gets the event first, then the OK button, which is probably what the user wants.
I must admit I don’t remember the sequence of “events” for this case, but the above doesn’t sound correct. The text field and the button are in different responder chains, so even if the event (i.e. NSEvent) isn’t consumed by one, it never gets passed to the other. I assume the default button behavior is actually mediated via the window.
In any case …
> If I click on OK instead the text edits are ignored (which is not what I want if the text field contains a setting for a job started by the OK press).
>
> I can see two solutions:
>
> 1. Make the OK button inactive while any text field is edited
> 2. Make sure hitting the OK button triggers the end of any text editing first.
>
> Which is to be preferred?
#1 doesn’t sound right, unless perhaps you really wish the user to press Return twice to close the dialog (via the keyboard).
For #2, you shouldn’t need to use any delegates. Instead, you need to get the text field to commit its edit. There is an informal protocol for this (NSEditor), which text fields conform to.
The problem is that NSWindowController doesn’t implement the other informal protocol (NSEditorRegistration) that is the way that editors are supposed to be kept track of. The easiest way to get around this is for your OK button action to invoke “commitEditing” on the text field. Alternatively, invoke “commitEditing” from the window delegate's “windowWillClose” method (normally in the window controller).
Strangely, NSViewController *does* implement NSEditor/NSEditorRegistration, so if your text field is in a view that has a view controller — the window controller’s contentViewController, if this is all coming from a storyboard — you can instead issue the “commitEditing” to the view controller, and it will commit *all* editors. That’s more convenient if you have multiple text fields, and/or you don’t want to have to write code with explicit references to them.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden