已编辑了两个NSTextView中的哪一个? doCommandBySelector总是返回第一个

时间:2014-06-25 00:54:40

标签: objective-c cocoa nstextview

我迫切希望找到答案,所以我从Apple打开了TextLayoutDemo示例项目。关键是:我有两个NSTextViews用于列视图。一切正常,我输入的文字通过单一布局管理器成功地在这两个文本视图中进行布局:

    NSLayoutManager *twoColumnLayoutManager = [[NSLayoutManager alloc] init];

    NSTextContainer *firstColumnTextContainer = [[NSTextContainer alloc] init];
    NSTextContainer *secondColumnTextContainer = [[NSTextContainer alloc] init];

    NSTextView *firstColumnTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 240, 360) textContainer:firstColumnTextContainer];
    firstColumnTextView.delegate = self;
    NSTextView *secondColumnTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(240, 0, 240, 360) textContainer:secondColumnTextContainer];
    secondColumnTextView.delegate = self;

    [firstColumnTextContainer setContainerSize:NSMakeSize(240, 360)];
    [secondColumnTextContainer setContainerSize:NSMakeSize(240, 360)];

    [twoColumnLayoutManager addTextContainer:firstColumnTextContainer];
    [twoColumnLayoutManager addTextContainer:secondColumnTextContainer];
    [twoColumnLayoutManager replaceTextStorage:[firstTextView textStorage]];

    [[secondWindow contentView] addSubview:firstColumnTextView];
    [[secondWindow contentView] addSubview:secondColumnTextView];

但我的目标是了解用户编辑文本的文本视图。如果它是左边的,我需要调用一个方法,但如果它是正确的,我想调用另一个方法。并且似乎无法识别正确的文本视图,因为委托始终会通过第一个文本视图得到通知。

- (BOOL) textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
    NSLog(@"edit: %@", textView);
    return NO;
}

即使我在第二个文本中更改文本,此方法也始终打印第一个文本视图。而且我认为这是根据文档进行的,Apple称其中只有第一个串联的NSTextView。

但我怎么能解决我的问题?

1 个答案:

答案 0 :(得分:0)

告诉我,如果这个解决方案是我正在寻找的解决方案。事实上,因为它运作得很好。我不明白的一件事是为什么Cocoa文本系统在没有必要的情况下如此棘手?

- (void)textStorageDidProcessEditing:(NSNotification *)aNotification {
    // that's the active text view
    NSWindow *keyWindow = [[NSApplication sharedApplication] keyWindow];
    NSTextView *activeTextView = (NSTextView *)[keyWindow firstResponder];
    NSLog(@"%p", activeTextView);
}

更新:仅当用户单击鼠标按钮时才有效。箭头键不会更新窗口的第一响应者:(