如何在SwiftUI 2.0中使拾取程序的标题保持粘性

如何在SwiftUI 2.0中使拾取程序的标题保持粘性,swiftui,Swiftui,我想在Swiftui2.0中为选择器添加一个搜索栏。下面的演示代码实现了这一点,但是当用户滚动列表时,搜索栏是滚动列表的一部分,而不是位于顶部。我怎样才能改变这个 import SwiftUI import UIKit struct ContentView: View { @State private var selection = 0 @State private var searchText = "" var body: some View {

我想在Swiftui2.0中为选择器添加一个搜索栏。下面的演示代码实现了这一点,但是当用户滚动列表时,搜索栏是滚动列表的一部分,而不是位于顶部。我怎样才能改变这个

import SwiftUI
import UIKit

struct ContentView: View {
    @State private var selection = 0
    @State private var searchText = ""

    var body: some View {
        NavigationView {
            Form {
                Picker(selection: $selection, label: Text("Picker")) {
                    SearchBar(text: $searchText, placeholder: "Search")
                    ForEach(1 ..< 21) { index in
                        Text(String(index)).tag(index)
                    }
                }
            }
        }
    }
}

struct SearchBar: UIViewRepresentable {
    @Binding var text: String
    var placeholder: String

    func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
        let searchBar = UISearchBar(frame: .zero)
        searchBar.delegate = context.coordinator

        searchBar.placeholder = placeholder
        searchBar.autocapitalizationType = .none
        searchBar.searchBarStyle = .minimal
        return searchBar
    }

    func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
        uiView.text = text
    }

    func makeCoordinator() -> SearchBar.Coordinator {
        return Coordinator(text: $text)
    }

    class Coordinator: NSObject, UISearchBarDelegate {
        @Binding var text: String

        init(text: Binding<String>) {
            _text = text
        }

        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            text = searchText
        }
    }
}
导入快捷界面
导入UIKit
结构ContentView:View{
@国家私有变量选择=0
@国家私有var searchText=“”
var body:一些观点{
导航视图{
形式{
选择器(选择:$selection,标签:Text(“选择器”)){
搜索栏(文本:$searchText,占位符:“搜索”)
ForEach(1..<21){index in
文本(字符串(索引)).tag(索引)
}
}
}
}
}
}
结构搜索栏:UIViewRepresentable{
@绑定变量文本:字符串
变量占位符:字符串
func makeUIView(上下文:UIViewRepresentableContext)->UISearchBar{
让searchBar=UISearchBar(帧:.0)
searchBar.delegate=context.coordinator
searchBar.placeholder=占位符
searchBar.autocapitalizationType=.none
searchBar.searchBarStyle=.minimal
返回搜索栏
}
func updateUIView(uiView:UISearchBar,context:UIViewRepresentableContext){
uiView.text=文本
}
func makeCoordinator()->SearchBar.Coordinator{
退货协调员(文本:$text)
}
类协调器:NSObject,UISearchBarDelegate{
@绑定变量文本:字符串
init(文本:绑定){
_文本=文本
}
func searchBar(searchBar:UISearchBar,textDidChange searchText:String){
文本=搜索文本
}
}
}

我无法使用Picker。但是我用下面的代码做了完全一样的事情。希望这能对你有所帮助

import SwiftUI

import UIKit

struct ContentView: View {
    @State private var selection = 0
    @State var navigateBack = false

var body: some View {
    NavigationView {
        Form {
            NavigationLink(
                destination: ItemSelectionView(selectedIndex: $selection, navigateBack: $navigateBack),
                isActive: $navigateBack,
                label: {
                    Text("Picker")
                })
                .overlay(
                    HStack {
                        Spacer()
                        Text(selection.description)
                    }
                    .padding(.trailing)
                )
        }
    }
    
    
    }
}
struct SearchBar: UIViewRepresentable {
    @Binding var text: String
    var placeholder: String

func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
    let searchBar = UISearchBar(frame: .zero)
    searchBar.delegate = context.coordinator
    
    searchBar.placeholder = placeholder
    searchBar.autocapitalizationType = .none
    searchBar.searchBarStyle = .minimal
    return searchBar
}

func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
    uiView.text = text
}

func makeCoordinator() -> SearchBar.Coordinator {
    return Coordinator(text: $text)
}

class Coordinator: NSObject, UISearchBarDelegate {
    @Binding var text: String
    
    init(text: Binding<String>) {
        _text = text
    }
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        text = searchText
    }
}
}

    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
    }
}

struct ItemSelectionView: View {
    @Binding var selectedIndex: Int
    @Binding var navigateBack: Bool

let columns: [GridItem] = [
    GridItem(.flexible())
]
@State private var searchText = ""
var body: some View {
    ScrollView {
        LazyVGrid(columns: columns, alignment: .leading, pinnedViews: [.sectionHeaders ]) {
            Section(header:  SearchBar(text: $searchText, placeholder: "Search")) {
                ForEach(1 ..< 21) { index in
                    HStack {
                        Text(String(index))
                        Spacer()
                        if selectedIndex == index
                        {
                            Image(systemName: "checkmark")
                        }
                    }
                    .padding(.horizontal)
                    .contentShape(Rectangle())
                    .onTapGesture {
                        selectedIndex = index
                        navigateBack.toggle()
                    }
                    
                    Divider()
                }
            }
        }
    }
    }
}
导入快捷界面
导入UIKit
结构ContentView:View{
@国家私有变量选择=0
@状态变量navigateBack=false
var body:一些观点{
导航视图{
形式{
导航链接(
目的地:ItemSelectionView(selectedIndex:$selection,navigateBack:$navigateBack),
isActive:$navigateBack,
标签:{
文本(“选择器”)
})
.覆盖(
HStack{
垫片()
文本(选择.说明)
}
.padding(.training)
)
}
}
}
}
结构搜索栏:UIViewRepresentable{
@绑定变量文本:字符串
变量占位符:字符串
func makeUIView(上下文:UIViewRepresentableContext)->UISearchBar{
让searchBar=UISearchBar(帧:.0)
searchBar.delegate=context.coordinator
searchBar.placeholder=占位符
searchBar.autocapitalizationType=.none
searchBar.searchBarStyle=.minimal
返回搜索栏
}
func updateUIView(uiView:UISearchBar,context:UIViewRepresentableContext){
uiView.text=文本
}
func makeCoordinator()->SearchBar.Coordinator{
退货协调员(文本:$text)
}
类协调器:NSObject,UISearchBarDelegate{
@绑定变量文本:字符串
init(文本:绑定){
_文本=文本
}
func searchBar(searchBar:UISearchBar,textDidChange searchText:String){
文本=搜索文本
}
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}
结构项选择视图:视图{
@绑定变量selectedIndex:Int
@绑定变量返回:Bool
let列:[GridItem]=[
GridItem(.flexible())
]
@国家私有var searchText=“”
var body:一些观点{
滚动视图{
LazyVGrid(列:列,对齐:。前导,固定视图:[.sectionHeaders]){
节(标题:搜索栏(文本:$searchText,占位符:“搜索”)){
ForEach(1..<21){index in
HStack{
文本(字符串(索引))
垫片()
如果选择了索引==索引
{
图像(系统名称:“选中标记”)
}
}
.padding(.卧式)
.contentShape(矩形())
.ontapsigne{
selectedIndex=索引
navigateBack.toggle()
}
分隔器()
}
}
}
}
}
}

类似的事情也是我的结局。似乎使用标准的选择器是不可能的。是的,我试着在选择器中使用LazyVGrid,但它确实按照我认为的方式运行。所以我不得不移除选择器。似乎不可能将搜索栏与标准选择器一起使用。我最终创建了自己的选择器。