如何在SwiftUI 2.0中使拾取程序的标题保持粘性
我想在Swiftui2.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 {
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,但它确实按照我认为的方式运行。所以我不得不移除选择器。似乎不可能将搜索栏与标准选择器一起使用。我最终创建了自己的选择器。