ios SwiftUI键盘工具栏作用域

flvlnr44  于 2023-03-05  发布在  iOS
关注(0)|答案(2)|浏览(142)

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

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修饰符只应用于“第一个”文本字段,因此我期望它只在“第一个”文本字段处于焦点时才显示在键盘上,但实际上,它在“第二个”文本字段处于焦点时也会显示。
这是预期的行为吗?如果是,我如何为不同的文本字段使用不同的键盘工具栏?

iszxjhcz

iszxjhcz1#

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

8qgya5xd2#

您可以定义一个selection变量,在选择TextField时设置该变量。
然后,在.toolbar中,您可以检查正在编辑的TextField,然后显示相应的Button
将其 Package 在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") { }
                }
            }
        }
    }
}

相关问题