3

我放置了一个NSSearchField并将其边框设置为none,我发现清除按钮不可点击,也就是点击时没有响应。如果我再次设置边框,它工作正常。

在此处输入图像描述

我已经调试了几个小时,发现当我将边框设置为无时,文本编辑器的宽度将扩大并遮蔽(覆盖)清除按钮。

截屏

在此处输入图像描述

查看层次结构调试截图

在此处输入图像描述

重现步骤:

  1. 创建一个空的可可项目/应用程序
  2. 放置一个NSSearchField
  3. 将边框设置为无
  4. 运行应用程序,填写搜索字段并尝试单击清除按钮

这是一个错误吗?还是打算这样做?

注:可可开发新手

4

3 回答 3

10

我遇到了这个问题,并将其视为 Cocoa 中的一个错误。但是在自定义控件或视图控制器中很容易修复。只需在界面生成器中保留文本字段的边界,然后通过拥有新的 CALayer 来终止边界。例如:

class ViewController: NSViewController {


@IBOutlet weak var searchField: NSSearchField!

override func viewDidLoad() {
    super.viewDidLoad()

    let maskLayer = CALayer()
    searchField.layer = maskLayer
    maskLayer.backgroundColor = searchField.backgroundColor?.CGColor
}
}

如您所见,我只是在新图层中恢复控制颜色,而不保留任何其他内容。它并不完美,但至少提供了良好的开端。

于 2016-08-13T01:24:24.503 回答
1

julia_v 的回答几乎是正确的。您还应该从 rect.origin.x 中删除 searchButtonWidth 以将 rect 向后偏移。

而且我还添加了更多逻辑来仅在需要时制作这些“技巧”。

override func select(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, start selStart: Int, length selLength: Int) {

    var newRect = rect

    if !isBordered || isBezeled {
        let cancelButtonWidth = NSWidth(cancelButtonRect(forBounds: rect))
        let searchButtonWidth = NSWidth(searchButtonRect(forBounds: rect))

        newRect.size.width -= (cancelButtonWidth + searchButtonWidth)
        newRect.origin.x += searchButtonWidth
    }
    super.select(withFrame: newRect, in: controlView, editor: textObj, delegate: delegate, start: selStart, length: selLength)
}

创建子类后,只需在 IB 身份检查器中将其设置为 NSSearchFieldCell 实例。

于 2017-05-01T04:34:12.023 回答
0

在代码中创建的 NSSearchField 中有同样的问题。通过覆盖子类中的 NSSearchFieldCell 方法来解决它:

 - (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength
{
    NSRect newRect = aRect;
    newRect.size.width -= (NSWidth([self searchButtonRectForBounds:aRect]) + NSWidth([self cancelButtonRectForBounds:aRect]));
    [super selectWithFrame:newRect inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
}

此方法在鼠标单击字段的文本区域后调用。它似乎也是设置插入点颜色的好地方。

于 2016-08-16T09:06:31.087 回答