OSX可可NSSearchField清除按钮没有响应点击

问题描述:

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

enter image description here

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

截图

enter image description here

查看层次调试截图

enter image description here

重现步骤:

  1. 创建一个空的可可项目/应用
  2. 放置一个NSSearchField
  3. 设置边框无
  4. 运行应用程序,填补了搜索领域,并尝试点击清除按钮

这是一个错误?或者它是否打算这样做?

注:新手可可开发

我面对这个问题,并认为它是可可的错误。但是在自定义控件或视图控制器中很容易修复。只要保持界面构建器中的文本字段的边界,然后通过拥有新的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 
} 
} 

正如你所看到的,我只是在新层中恢复控制颜色而不保留其他任何东西。这并不完美,但至少可以带来好的开始。

+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]; 
} 

这种方法是在球场上的文本区域中鼠标点击后调用。它似乎也是设置插入点颜色的好地方。

+0

此解决方案的问题是,如果Apple修复了selectWithFrame中的错误,那么您将传递比您应该做的更小的矩形,并且搜索字段太小。 Eugene的解决方案是插入一个隐藏边界的图层,当bug修复时不太可能产生任何负面影响。 – tarmes

julia_v's answer几乎是正确的。您还应该从rect.origin.x中删除searchButtonWidth以将回调抵消掉。

而且我还增加了一些逻辑,只在需要时才制作这些“技巧”。

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实例。