我有一个NSTextView
withusesFindBar = YES
和incrementalSearchingEnabled = YES
。如果我按 ⌘F 召唤查找栏,然后按 Escape 隐藏查找栏,焦点不会返回到文本区域,即使self.window.firstResponder
仍然是文本视图(我用计时器打印出来)。不过,按 Tab 键会将焦点返回到编辑器。我怎样才能自动做到这一点?
问问题
273 次
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
从我的辞职中解决了它,然后也手动分配它。这非常有效。我希望它有帮助!UITextfield
UISearchBar
于 2013-06-22T01:29:32.527 回答