在这段SwiftUI代码中,我有一个包含搜索栏的视图,搜索栏下面是一些呈胶囊形状的筛选器标记&图像.

当点击搜索栏时,键盘向上移动视图,过滤器标签覆盖搜索栏.

我想更改代码,以便在点击搜索栏时将showingTages设置为False,以避免此UI错误

我try 在.seearble修饰符上使用.onTapGesture{},但似乎不起作用.当点击搜索栏时,如何确保不显示标记?

以下是我的代码:

struct ProductSearchView: View {

    @StateObject var marketplaceModel = MarketplaceViewModel()
    @State var searchText = ""
    @State var product_array_status = true
    @State var product_array_status_search = false
    @State var product_array_status_tags = false
    @State var showingTags: Bool = true

    var body: some View {

        ZStack {
            Color("BG")
                .ignoresSafeArea()

            VStack {

                if showingTags {
                    TagView()
                }
               
                if product_array_status_search {
                    VStack(spacing: 15) {
                        ScrollView(.vertical, showsIndicators: false) {
                            ForEach(marketplaceModel.filteredProduct.filter { ($0.product_name ?? "").contains(searchText)}, id: \.self) { product in

                                ProductSearchRow(productData: product)
                            }
                        }
                    }
                    .onAppear {
                        showingTags.toggle()
                    }
                } else if product_array_status_tags {
                    VStack(spacing: 15) {
                        ScrollView(.vertical, showsIndicators: false) {
                            ForEach(marketplaceModel.product_tag_array, id: \.self) { product in

                                ProductSearchRow(productData: product)
                            }
                        }
                    }
                } else {
                    Image("PlaceholderImage")
                        .resizable()

                }
                Spacer()
            }
        }
        .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
 .onAppear {
            let defaults = UserDefaults.standard
            let keyString = defaults.string(forKey: "key") ?? ""
            self.marketplaceModel.fetchProductData(key: keyString)
        }
        .onChange(of: marketplaceModel.search, perform: { value in
            // to avoid Continues Search requests....
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                if value == marketplaceModel.search && marketplaceModel.search != ""{
                    // Search Data....
                    marketplaceModel.filterData()
                }
            }
            if marketplaceModel.search == ""{
                // reset all data....
                withAnimation(.linear) {
                    product_array_status = true
                    product_array_status_search = false
                }
            }
        })
    }
}

如何确保在点击.seearble提供的搜索栏时不显示TagView()?

推荐答案

您可以使用环境值isSearching来检测搜索文本字段是否被聚焦.

您应该声明Environment,而不是在ProductSearchView中,而是在searchable视图的一个子视图中.因为这决定了TagView的可见度,所以如果你把它放到TagView可能是最容易的:

struct TagView: View {
    @Environment(\.isSearching) var isSearching: Bool
    var body: some View {
        if !isSearching {
            // put the original contents of "body" here...
        }
        // if isSearching is true, then the body is empty. The view is basically "hidden".
    }
}

现在你甚至不需要showingTags美元了!

Ios相关问答推荐

无法在fastlane和github操作中从react-native 应用程序构建ios

我想在expo 中使用useSafeAreaInsets来获取paddingbottom,但我得到了一个错误

Flutter应用内购买无法恢复购买

SwiftUI 每秒从 Timer 更新单个 @State 属性,每秒也重绘整个视图

Flutter动画放大图

将 URLCache 子类与 URLSession 一起使用

.frame() 修饰符的位置如何影响视图?

List touch Tabbar 时 SwiftUI Tabbar 消失

从视图模型中更新 EnvironmentObject

我可以在 Apple-Watch 上使用 iPhone 的摄像头扫描 SwiftUi 中的二维码(例如用于登录)吗

SwiftUI - 在ForEach的每个元素之间自动添加分隔符

Swift如何表示单位转换的标准大气压

Xcode intellisense 彩色框中字母的含义,如 f、T、C、M、P、C、K、# 等

iPhone iOS 无法正确显示 box-shadow

如何在 SwiftUI 中检测 TextField 的实时变化?

通过 iOS 创建和导出动画 gif?

将 iPhone xib 转换为 iPad xib?

在 iPhone 应用程序中使用 SSL - 出口合规性

在 React Native 中保存敏感数据

iOS应用程序每隔一次启动就会崩溃,找不到错误