SwiftUI 键盘工具栏范围

Posted

技术标签:

【中文标题】SwiftUI 键盘工具栏范围【英文标题】:SwiftUI Keyboard Toolbar Scope 【发布时间】:2021-10-07 09:30:01 【问题描述】:

假设我们有以下两个文本字段的视图:

struct ContentView: View 
    
    @State private var first = ""
    @State private var second = ""
    
    var body: some View 
        VStack 
            TextField("First", text: $first)
                .toolbar 
                    ToolbarItem(placement: .keyboard) 
                        Button("Test")  
                    
                
            
            TextField("Second", text: $second)
        
    

toolbar 修饰符仅应用于“第一个”文本字段。因此,我的期望是它只显示在键盘上,当“第一个”文本字段成为焦点时。 但是在实践中会发生什么,它也会在“第二个”文本字段处于焦点时显示出来。

这是预期的行为吗?如果是这样,我怎样才能为不同的文本字段设置不同的键盘工具栏?

【问题讨论】:

是的,这是预期行为 - 您将工具栏附加到哪个视图以呈现它并不重要。如果您需要有条件地附加它,请查找FocusStatefocused 以及如何制作条件修饰符。 为特定文本字段指定工具栏的唯一方法是返回 UIKit。我也不是特别喜欢这种设置。扫描文本时,使用此功能可能会变得很奇怪。 FocusStatefocused 在这里没有区别,将工具栏添加到一个文本字段显然会将其添加到所有文本字段中,而不管焦点如何。 【参考方案1】:

到目前为止,我发现唯一可以解决此问题的方法有效,但感觉不对。它还会在控制台中生成一些布局约束警告。

如果您将每个TextField 包装在NavigationView 中,则每个`TextField 都会有自己的上下文,因此也有自己的工具栏。

类似这样的:

struct ContentView: View 
    
    @State private var first = ""
    @State private var second = ""
    
    var body: some View 
        VStack 
          NavigationView 
            TextField("First", text: $first)
                .toolbar 
                    ToolbarItem(placement: .keyboard) 
                        Button("Test")  
                    
                
          
          NavigationView   
            TextField("Second", text: $second)
          
        
    

【讨论】:

以上是关于SwiftUI 键盘工具栏范围的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 使工具栏的 NavigationLink 使用详细视图

SwiftUI:如何在 macOS 11 上设置工具栏的标题?

SwiftUI:macOS 工具栏最初是灰色的

为啥使用 SwiftUI 按钮的图像背景不显示在工具栏中?

SwiftUI:导航返回时如何平滑过渡bottomBar工具栏?

StateObject 的 SwiftUI 工具栏操作导致帧速率下降