我正在使用 SwiftUI 1.0。
我为 SwiftUI 创建了一个搜索栏,如下所示:
import SwiftUI
struct Searchbar: NSViewRepresentable {
class Coordinator: NSObject, NSSearchFieldDelegate {
var parent: Searchbar
init(_ parent: Searchbar) {
self.parent = parent
}
func controlTextDidChange(_ notification: Notification) {
guard let searchField = notification.object as? NSSearchField else {
log.error("Unexpected control in update notification", source: .ui)
return
}
self.parent.search = searchField.stringValue
}
}
@Binding var search: String
func makeNSView(context: Context) -> NSSearchField {
let searchfield = NSSearchField(frame: .zero)
return searchfield
}
func changeSearchFieldItem(searchfield: NSSearchField, sender: AnyObject) -> NSSearchField {
//Based on the Menu item selection in the search field the placeholder string is set
(searchfield.cell as? NSSearchFieldCell)?.placeholderString = sender.title
return searchfield
}
func updateNSView(_ searchField: NSSearchField, context: Context) {
searchField.stringValue = search
searchField.delegate = context.coordinator
}
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
}
到目前为止,在我的 View 中使用它时效果很好:
搜索栏(搜索:$searchText)
最佳答案
更新:如果您在 Big Sur,您还可以将 controlSize
设置为 .large
。
https://developer.apple.com/documentation/appkit/nscontrol/controlsize/large
您可以添加高度限制:
func makeNSView(context: Context) -> NSSearchField {
let searchfield = NSSearchField(frame: .zero)
searchfield.translatesAutoresizingMaskIntoConstraints = false
searchfield.heightAnchor.constraint(greaterThanOrEqualToConstant: 40).isActive = true
return searchfield
}
…适用于 macOS 11.1 Big Sur。不幸的是,对焦环不适应其高度。你可以像这样隐藏它:
searchTextField.focusRingType = .none
...但在大多数情况下这似乎并不可取。
关于swift - 更改 SwiftUI 中 NSSearchField 的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65674746/