如何让NSTextView的findBar返回焦点到编辑区?

时间:2013-06-22 01:20:16

标签: cocoa nstextview

我有NSTextView usesFindBar = YESincrementalSearchingEnabled = YES。如果我按⌘F召唤查找栏,然后按转义隐藏查找栏,焦点不会返回到文本区域,即使self.window.firstResponder仍然是文本视图(我用计时器打印出来) )。但是,按下选项卡会将焦点返回到编辑器。我该如何自动完成?

3 个答案:

答案 0 :(得分:1)

确定。我已经解决了这个问题。 我的任务有点不同,但我想这对你和其他人来说非常有用。

以下是检测findBar show / hide事件的方法。

1)对NSScrollView进行子类化并覆盖-(void)tile方法。

注意: _findBarIsVisible 是最初设置为NO的iVar。

- (void)tile
{
    [super tile];

    // check if findBar did showUp or disappeared
    CGFloat fullHeight = self.bounds.size.height;
    CGFloat clipHeight = self.contentView.bounds.size.height;

    if (!_findBarIsVisible && fullHeight > clipHeight)
    {
        _findBarIsVisible = YES;
        NSLog(@"findBarIsVisible: %d", _findBarIsVisible);
    }
    else if (_findBarIsVisible && fullHeight == clipHeight)
    {
        _findBarIsVisible = NO;
        NSLog(@"findBarIsVisible: %d", _findBarIsVisible);
    }
}

现在您有切换findBar的事件。只需在此处输入一些必需的代码或通知某个控制器有关该事件的信息(就像我一样)。

在你的情况下,我猜你应该这样做:

[self.window makeFirstResponder:self.documentView];

在findBar隐藏的部分。

祝你好运!

答案 1 :(得分:0)

我在iOS开发中遇到了类似的问题。似乎firstResponder标志没有从我使用的前UI元素中正确地“取出”。我在关注firstResponder时以编程方式从我的UITextfield重新签名UISearchBar,然后手动分配它,我解决了这个问题。这非常有效。我希望它有所帮助!

答案 2 :(得分:0)

我也得到了这种奇怪的行为,因为解雇查找栏导致看似没有第一响应者。按“'选项卡'可将封闭的文本视图返回到第一响应者状态,就像在原始问题中一样。

我可怕的黑客是将封闭的NSScrollView子类化,并利用它符合NSTextFinderBarContainer协议的事实。我重写了-setFindBarVisible:

@implementation HorribleHackScrollView

- (void)setFindBarVisible:(BOOL)findBarVisible {
    [super setFindBarVisible:findBarVisible];
    if (self.findBarView && self.isFindBarVisible == NO) {
        [self.window makeFirstResponder:self.documentView];
    }
}

@end