When my application launches, the first NSTextField is being selected like this:
I can edit the NSTextField fine, but when I press enter to end the editing, th
I am using IB, there's a property on NSTextField
called Refuses First Responder
. Ticking that will prevent the highlighting of the text field immediately after the window is presented. There's some more detailed info about Refuses First Responder
in this question.
Your text field is selecting the text, due to the default implementation of becomeFirstResponder
in NSTextField
.
To prevent selection, subclass
NSTextField
, and overridebecomeFirstResponder
to deselect any text:
- (BOOL) becomeFirstResponder
{
BOOL responderStatus = [super becomeFirstResponder];
NSRange selectionRange = [[self currentEditor] selectedRange];
[[self currentEditor] setSelectedRange:NSMakeRange(selectionRange.length,0)];
return responderStatus;
}
The resulting behavior is that the field does not select the text when it gets the focus.
To make nothing the first responder, call
makeFirstResponder:nil
after your application finishes launching. I like to subclassNSObject
to definedoInitWithContentView:(NSView *)contentView
, and call it from myNSApplicationDelegate
. In the code below,_window
is anIBOutlet
:
- (void) applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
[_menuController doInitWithContentView:_window.contentView];
}
The reason your field is getting focus when the application starts is because the window automatically gives focus to the first control. It determines what is considered first, by scanning left to right, top down (it scans left to right first, since a text field placed at the top right will still get focused). One caveat is that if the window is restorable
, and you terminate the application from within Xcode, then whatever field was last focused will retain the focus state from the last execution.
No need to subclass. Simply set refusesFirstResponder
= YES;
NSTextField *textField = [NSTextField new];
textField.refusesFirstResponder = YES;
That's it! Do that and it won't highlight the text in the field.