可选的NSTextField和NSColorPanel - 如何打破他们不受欢迎的相互作用?

时间:2017-11-02 12:59:28

标签: cocoa nstextfield nscolorpanel nscolorwell

在一个看似微不足道的设置中,我遇到了可选择的 NSTextField NSColorPanel 之间不可取的相互作用,这是我无法摆脱的,这让我疯狂。

以下是设置:在一个窗口中,我有一个可选的多行标签(事实上是 NSTextField )和 NSColorWell

Color Well 允许用户在GUI中为几何对象着色;它与文本无关。当然,点击颜色激活它,即调出共享的 NSColorPanel 并将颜色连接到它。

文本字段完全独立于GUI中的彩色对象,并向用户显示数据。它是只读的,即不可编辑。由于数据是按列组织的,因此我使用制表符进行文本格式设置,使用 NSTextField setAttributedStringValue:方法来显示数据。

乍一看,一切都像你期望的那样有效。

但是这里有一个问题:我希望用户能够复制文本字段中的数据以在其他地方处理它。因此, NSTextField 必须可选择。并将其设置为selectable是问题的起点:

当用户点击可选文本字段以选择文字时,窗口的字段编辑器会接管,因此,属性文本的所有标签设置都会丢失,文字会被删除混到。阻止此操作的常用方法是将 NSTextField allowsEditingTextAttributes属性设置为YES。如果我这样做,当用户选择文本时,将保留选项卡格式。 现在 NSColorPanel (如果可见)无意中切换到文字颜色(总是黑色),如果颜色是活动(连接到 NSColorPanel ),它将保持活动状态,从而将所有几何GUI对象的颜色更改为黑色。哎哟!

我发现无法将 NSTextField selectableallowsEditingTextAttributes属性设置为YES,但仍然阻止它与 NSColorPanel进行通信

显而易见的替代路线是保留所选文本的标签格式,即使allowsEditingTextAttributes设置为NO(这会根据需要断开颜色面板与文本字段的连接)。但是我对这种方法也没有成功,虽然我不明白为什么:

我的想法是将所需的标签设置为文本字段的字段编辑器的defaultParagraphStyle。所以,我设置了一个自定义的字段编辑器:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
        NSArray *myTabs = @[
            [[NSTextTab alloc] initWithType:NSRightTabStopType location:100],
            [[NSTextTab alloc] initWithType:NSRightTabStopType location:200],
            [[NSTextTab alloc] initWithType:NSRightTabStopType location:300]
        ];
        NSMutableParagraphStyle *myParagraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
        [myParagraphStyle setTabStops:myTabs];

        myFieldEditor = [NSTextView new]; // myFieldEditor is an instance variable
        [myFieldEditor setDefaultParagraphStyle:myParagraphStyle];

        [window setDelegate:self];
        [window fieldEditor:YES forObject:myTextField];
    }

并为windowWillReturnFieldEditor:toObject:委托方法中的文本字段激活它:

- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client
    {
        if (client == myTextField) return myFieldEditor;
        return nil;
    }

我甚至确保我的自定义字段编辑器确实用于继承我的文本字段的 NSTextFieldCell 并记录传播的字段编辑器:

@implementation myTextFieldCell

- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj
    {
        NSTextView *newTextObj = (NSTextView*)[super setUpFieldEditorAttributes:textObj];
        NSLog(@"STYLE: %@", [newTextObj defaultParagraphStyle]);
        return newTextObj;
    }

@end

现在,当我在文本字段中选择文本时,我得到以下日志输出:

2017-11-02 11:51:07.432 Demo[94807:303] STYLE: Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (
    100R,
    200R,
    300R
), DefaultTabInterval 0, Blocks (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0.05, HeaderLevel 0

这正是预期的结果。

但是仍然,一旦我选择了文本,标签格式就会在文本字段中消失。我不知道为什么这不起作用。

所以我被卡住了。如果我将 NSTextField allowsEditingTextAttributes属性设置为YES,则在选择文本时会保留选项卡格式,但GUI中的彩色对象会无意中更改为黑色。如果我将allowsEditingTextAttributes属性设置为NO,则颜色面板会按预期运行,但只要我选择文本,标签格式就会丢失。

这是一个非常不幸的案例,Cocoa试图过于聪明,从而使一个完全无关紧要的设置成为一个巨大的问题。

任何想法?

0 个答案:

没有答案