2016-08-12 3 views
3

Я размещаю NSSearchField и устанавливаю ее границу none, и я обнаружил, что кнопка очистки не может быть нажата. A.k.a. не отвечает при нажатии. Если я снова установил границу, она работает нормально.OSX Cocoa Кнопка очистки NSSearchField не отвечает на нажатие

enter image description here

Я отладка это в течение нескольких часов, и обнаружил, что, когда я установил границу непревзойденного, ширина текстового редактора будет расширяться и тень (обложка) кнопка Очистить.

Скриншот

enter image description here

Посмотреть скриншот иерархии отладки

enter image description here

Шаги для воспроизведения:

  1. Создание проекта пустой какао/приложение
  2. Разместить NSSearchField
  3. Установить границы никто не
  4. Запустите приложение, заполнить поле поиска и попробуйте нажать кнопку Очистить

Является ли это ошибка ? Или он должен вести себя таким образом?

Примечание: Новичок в разработке какао

ответ

7

Я столкнулся с этой проблемой, и считается его как ошибка в какао. Но его легко исправить в пользовательском контроле или в контроллере представления. Просто сохраните текстовое поле, ограниченное в построителе интерфейса, а затем убейте границу, получив новый 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

Спасибо, что сделал трюк! –

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, вы пройдете меньший прямоугольник, чем вы должны делать, и поле поиска будет слишком маленьким. Решение Юджина вставить слой, который скрывает границу, с меньшей вероятностью будет иметь какие-либо негативные последствия при исправлении ошибки. – tarmes

0

julia_v's answer почти правильный. Вы также должны удалить searchButtonWidth из rect.origin.x для смещения назад.

А также я добавил еще немного логики, чтобы сделать эти «трюки» только тогда, когда это необходимо.

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) 
} 

После создания подкласса просто установить его NSSearchFieldCell, например, в IB инспектор идентичности.

Смежные вопросы