1

我有一个NSTextViewwithusesFindBar = YESincrementalSearchingEnabled = YES。如果我按 ⌘F 召唤查找栏,然后按 Escape 隐藏查找栏,焦点不会返回到文本区域,即使self.window.firstResponder仍然是文本视图(我用计时器打印出来)。不过,按 Tab 键会将焦点返回到编辑器。我怎样才能自动做到这一点?

4

3 回答 3

1

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

以下是如何检测 findBar 显示/隐藏事件的方法。

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

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

- (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 隐藏的部分。

祝你好运!

于 2014-09-06T16:03:41.137 回答
1

我也遇到了这种奇怪的行为,即取消查找栏会导致似乎没有第一响应者。就像在原始问题中一样,按“选项卡”将封闭的文本视图返回到第一响应者状态。

我可怕的 hack 是子类化封装NSScrollView并利用它符合NSTextFinderBarContainer协议的事实。我覆盖-setFindBarVisible:.

@implementation HorribleHackScrollView

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

@end
于 2017-10-28T04:56:56.750 回答
0

我在iOS开发中遇到了类似的问题。似乎该firstResponder标志没有从我使用的前 UI 元素中正确“获取”。我通过在专注于时以编程方式firstResponder从我的辞职中解决了它,然后也手动分配它。这非常有效。我希望它有帮助!UITextfieldUISearchBar

于 2013-06-22T01:29:32.527 回答