SwiftUI macOS 在 TextField 处于活动状态时使用箭头键滚动列表

Posted

技术标签:

【中文标题】SwiftUI macOS 在 TextField 处于活动状态时使用箭头键滚动列表【英文标题】:SwiftUI macOS Scroll a List With Arrow Keys While a TextField is Active 【发布时间】:2020-01-16 06:49:34 【问题描述】:

我想使用 SwiftUI TextField 和 SwiftUI List 在项目列表上方呈现“搜索框”。类似于 Safari 帮助菜单项中的搜索框...它提供了一个搜索框,您可以在其中输入文本,同时使用向上和向下箭头键浏览结果列表。

我玩过onMoveCommandfocusable,并对“父”NSWindow 进行了调整,但还没有找到一种清晰而明显的方法让TextField 不断接受输入,同时仍然能够使用向上和向下箭头键导航底层List。下面的代码允许在TextField 中输入文本,或在列表条目中导航,但不能同时...

struct ContentView: View 

  @State var text: String = ""
  @State var selection: Int? = 1

  var body: some View 
    VStack 
      TextField("Enter text", text: $text)
      List(selection: $selection) 
        ForEach((1...100), id: \.self) 
          Text("\($0)")
        
      
    
  

【问题讨论】:

你好,我遇到了和你一样的问题。想知道您是否有任何解决方案?我认为问题在于 TextField 接管了所有 onMoveCommand,并使 List 无法对事件做出反应。不确定您是否取得了任何进展,如果您有解决方案,请告诉我。谢谢 我遇到了同样的问题,最终使用 AppKit 而不是 SwiftUI 重写了整个视图,以便能够拦截关键事件并控制 tableview 的选择。 【参考方案1】:

您可以将 NSTextField 包装在 NSViewRepresentable 中,并使用 NSTextFieldDelegate 拦截上下移动键。你可以看看我的建议演示。

Source of a text field with suggestions

【讨论】:

以上是关于SwiftUI macOS 在 TextField 处于活动状态时使用箭头键滚动列表的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI TextField (MacOS) 的奇怪行为

SwiftUI for MacOS 中的多行 TextField/TextEditor 表单

SwiftUI macOS 在 TextField 处于活动状态时使用箭头键滚动列表

如何在 MacOS 的 SwiftUI 中向 TextEditor 添加焦点环

如何在 SwiftUI macOS 中创建第一响应者

SwiftUI macOS currencyFormatter 不更新绑定变量