SwiftUI键盘工具栏范围

5

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

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修饰符仅应用于“第一个”文本字段。因此,我的期望是,只有当“第一个”文本字段聚焦时,它才会显示在键盘上。

但实际情况是,当“第二个”文本字段聚焦时,它也会出现。

这是否是预期行为?如果是,那么我如何为不同的文本字段设置不同的键盘工具栏?


1
是的,这是预期行为 - 无论将工具栏附加到哪个视图以呈现它都没有关系。如果您需要有条件地附加它,请查找“FocusState”和“focused”以及如何制作条件修饰符。 - Asperi
唯一指定特定文本字段的工具栏的方法是返回到UIKit。我也不是特别喜欢这种设置。扫描文本时,此功能可能会变得非常奇怪。 - lorem ipsum
FocusStatefocused在这里没有区别,将工具栏添加到一个文本字段似乎会将其添加到所有文本字段,而不考虑焦点。 - Jimbo
2个回答

2
到目前为止,我找到的唯一解决此问题的方法是有效的,但感觉不太对。它还会在控制台中生成一些布局约束警告。
如果您将每个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)
          }
        }
    }
}

0

您可以定义一个selection变量,当您的TextField被选中时设置它。

然后,在您的.toolbar中,您可以检查正在编辑哪个TextField,然后显示适当的Button

将其包装在NavigationView中确实可以工作,但也会导致布局问题。这个解决方案也可以在ForEach循环中使用。

struct ContentView: View {
    
    @State private var first = ""
    @State private var second = ""
    @State private var selection: Int?
    
    var body: some View {
        VStack {
            TextField("First", text: $first, onEditingChanged: { isEditing in
                self.selection = isEditing ? 1 : nil
            })
            
            TextField("Second", text: $second, onEditingChanged: { isEditing in
                self.selection = isEditing ? 2 : nil
            })
            
        }
        .toolbar {
            if selection == 1 {
                ToolbarItemGroup(placement: .keyboard) {
                    Button("Test") { }
                }
            }
        }
    }
}

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