swiftUI 3.0中.searchable召唤的.toolbar在键盘上如何显示?



我想在键盘工具栏中显示分段选择器,这是通过按搜索栏召唤的。到目前为止,我的代码看起来像这样:

import SwiftUI
struct ContentView: View {
@State var searchText = ""
@State var selected = false
var body: some View {
NavigationView{
Text(searchText)
.searchable(text: $searchText)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Picker(selection: $selected, label: Text(""), content: {
Text("false").tag(false)
Text("true").tag(true)
}) .pickerStyle(SegmentedPickerStyle())
}
}
}
}
}

我已经能够使这个工具栏与常规文本框一起工作,并认为将它与搜索栏一起使用将会很容易,但是没有带有文本字段代码的工具栏:

import SwiftUI
struct ContentView: View {
@State var textfieldText = ""
@State var selected = false
var body: some View {
NavigationView{
TextField("Textfield", text: $textfieldText)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Picker(selection: $selected, label: Text(""), content: {
Text("false").tag(false)
Text("true").tag(true)
}) .pickerStyle(SegmentedPickerStyle())
}
}
}
}
}

ToolbarItemGroup(placement: .keyboard)不能与.searchable()视图修饰符一起工作。


有一个名为isSearching的环境对象,它显示用户当前是否正在与由周围可搜索修饰符放置的搜索字段进行交互。

struct KeyboardToolbar<ToolbarView: View>: ViewModifier {
@Environment(.isSearching) var isSearching

let height: CGFloat
let toolbarView: ToolbarView

init(height: CGFloat, @ViewBuilder toolbar: () -> ToolbarView) {
self.height = height
self.toolbarView = toolbar()
}

func body(content: Content) -> some View {
ZStack(alignment: .bottom) {
GeometryReader { geometry in
VStack {
content
}
.frame(width: geometry.size.width, height: geometry.size.height)
}
if isSearching {
toolbarView
.frame(height: self.height)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}

extension View {
func keyboardToolbar<ToolbarView>(height: CGFloat, view: @escaping () -> ToolbarView) -> some View where ToolbarView: View {
modifier(KeyboardToolbar(height: height, toolbar: view))
}
}

使用.keyboardToolbar()

struct ContentView: View {
@State var searchText = ""
@State var selected = false

var body: some View {
NavigationView{
Text("Keyboar toolbar")
.keyboardToolbar(height: 50) {
Picker(selection: $selected, label: Text(""), content: {
Text("false").tag(false)
Text("true").tag(true)
}) .pickerStyle(SegmentedPickerStyle())
}
.searchable(text: $searchText)
}
}
}

https://developer.apple.com/documentation/swiftui/environmentvalues/issearching

最新更新