SwiftUI MacOSX搜索栏元素

3
我目前正在开发一款适用于MacOSX的SwiftUI应用程序。我有一个自定义的列表视图,其中包含许多行。我想要一个SearchBar来过滤我的行。
从Objective C转来,我知道有一个SearchBar和SearchBarController。我只需要一个具有默认Mac OS X搜索栏设计的SearchBar。然而,我没有找到任何东西。
在Stackoverflow上有一个答案,处理了相同的iOS问题。但是这不能转换为Mac OS X。
目前,我正在使用常规TextField并编写了自己的过滤脚本,这很好用。然而,我想要像Apple使用的SearchField UI。这可能吗?
有没有机会使用AppKit来实现这一点?
这就是我想要实现的:

enter image description here

2个回答

2

您最好将NSSearchField包装在NSViewRepresentable中。


谢谢。这就是我做的方式 :) 我稍后会分享我的代码 - davidev
@davidev 你能分享一下你的代码片段吗?谢谢! - Maschina
@Maschina 发布了它 :) - davidev
Paul在他的应用程序中创建了这样的视图。您可以在此处找到它https://github.com/twostraws/ControlRoom/blob/main/ControlRoom/NSViewWrappers/FilterField.swift - Kaunteya

1

这是我现在正在使用的解决方案:

struct FirstResponderNSSearchFieldRepresentable: NSViewControllerRepresentable {

    @Binding var text: String

      func makeNSViewController(
        context: NSViewControllerRepresentableContext<FirstResponderNSSearchFieldRepresentable>
      ) -> FirstResponderNSSearchFieldController {
        return FirstResponderNSSearchFieldController(text: $text)
      }

      func updateNSViewController(
        _ nsViewController: FirstResponderNSSearchFieldController,
        context: NSViewControllerRepresentableContext<FirstResponderNSSearchFieldRepresentable>
      ) {
      }
}

这里是 NSViewController。

class FirstResponderNSSearchFieldController: NSViewController {

  @Binding var text: String
  var isFirstResponder : Bool = true

    init(text: Binding<String>, isFirstResponder : Bool = true) {
    self._text = text
    super.init(nibName: nil, bundle: nil)
  }

  required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  override func loadView() {
    let searchField = NSSearchField()
    searchField.delegate = self
    
    self.view = searchField
  }

  override func viewDidAppear() {
    self.view.window?.makeFirstResponder(self.view)
  }
}


extension FirstResponderNSSearchFieldController: NSSearchFieldDelegate {

  func controlTextDidChange(_ obj: Notification) {
    if let textField = obj.object as? NSTextField {
      self.text = textField.stringValue
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接