Custom field editor for NSTextFieldCell in an NSTableView

前端 未结 5 1476
情歌与酒
情歌与酒 2021-02-06 16:39

I have a custom NSTableView subclass filled with several custom NSTextFieldCell subclasses. I would like to be able to change the edited cell by using

相关标签:
5条回答
  • 2021-02-06 17:25

    Possibly related entry in Apple documentation:

    setFieldEditor:

    Controls whether the text views sharing the receiver’s layout manager behave as field editors.

    - (void)setFieldEditor:(BOOL)flag
    

    Parameters

    flag: YES to cause the text views sharing the receiver's layout manager to behave as field editors, NO otherwise.

    Discussion

    Field editors interpret Tab, Shift-Tab, and Return (Enter) as cues to end editing and possibly to change the first responder. Non-field editors instead accept these characters as text input. See “Text Fields, Text Views, and the Field Editor” for more information on field editors. By default, text views don’t behave as field editors.

    0 讨论(0)
  • 2021-02-06 17:26

    The answer to the more general title of this question can be found in this answer: https://stackoverflow.com/a/8865953/43615

    Basically, one subclasses NSTextFieldCell and overrides fieldEditorForView:, where one simply creates a custom subclass of NSTextView and sets its fieldEditor property to YES.

    0 讨论(0)
  • 2021-02-06 17:26

    These should be overridden in keyDown:(NSEvent *)event method of your subclassed NSTextFieldCell object. You check the pressed key (one of the arrows) and otherwise call up to super.

    0 讨论(0)
  • 2021-02-06 17:27

    The easiest way to accomplish what you need is to implement control:textView:doCommandBySelector: in the table view's delegate.

    See also my answer to a similar question here: Arrow keys with NSTableView

    0 讨论(0)
  • 2021-02-06 17:41

    I spent almost all day on this problem, but I finally figured it out. In order to be able to traverse my NSTableView subclass with the arrow keys, I had to add the following method to my NSTableView:

    - (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector {
        if(aSelector == @selector(moveUp:)) {
            [self moveSelectionToPreviousRow];
            return YES;
        } else if(aSelector == @selector(moveDown:)) {
            [self moveSelectionToNextRow];
            return YES;
        } else if(aSelector == @selector(moveLeft:)) {
            [self moveSelectionToPreviousColumn];
            return YES;
        } else if(aSelector == @selector(moveRight:)) {
            [self moveSelectionToNextColumn];
            return YES;
        }
        return NO;
    }
    

    This is because the default field editor is an NSTextView (not an NSControl) so I needed to use the <NSTextViewDelegate> protocol. The view that is set as its delegate is the NSTableView, not the NSTextFieldCell. The moveSelectionTo... functions are custom functions defined in my NSTableView subclass that keep track of the currently edited cell and then move it around accordingly.

    0 讨论(0)
提交回复
热议问题