【问题标题】:Using TextField hides the ScrollView beneath it in VStack使用 TextField 在 VStack 中隐藏它下面的 ScrollView
【发布时间】:2021-12-15 17:50:33
【问题描述】:

此视图包含一个 pdf 名称列表,当点击打开 pdf 链接的 web 视图时。

视图在列表上方有一个搜索栏,点击该搜索栏会导致滚动视图消失。

struct AllPdfListView: View {
    @Environment(\.presentationMode) var mode: Binding<PresentationMode>
    
    @ObservedObject var pdfsFetcher = PDFsFetcher()
    
    @State var searchString = ""
    
    @State var backButtonHidden: Bool = false
    
    @State private var width: CGFloat?
    
    var body: some View {
        GeometryReader { geo in
            VStack(alignment: .leading, spacing: 1) {
                HStack(alignment: .center) {
                    Image(systemName: "chevron.left")
                    Text("All PDFs")
                        .font(.largeTitle)
                    Spacer()
                }
                .padding(.leading)
                .frame(width: geo.size.width, height: geo.size.height / 10, alignment: .leading)
                .background(Color(uiColor: UIColor.systemGray4))
                .onTapGesture {
                    self.mode.wrappedValue.dismiss()
                }
                HStack(alignment: .center) {
                    Image(systemName: "magnifyingglass")
                        .padding([.leading, .top, .bottom])
                    TextField ("Search All Documents", text: $searchString)
                        .textFieldStyle(PlainTextFieldStyle())
                        .autocapitalization(.none)
                    Image(systemName: "slider.horizontal.3")
                        .padding(.trailing)
                }
                .overlay(RoundedRectangle(cornerRadius: 10).stroke(.black, lineWidth: 1))
                .padding([.leading, .top, .bottom])
                .frame(width: geo.size.width / 1.05 )
                
                ScrollView {
                    ForEach($searchString.wrappedValue == "" ? pdfsFetcher.pdfs :
                                pdfsFetcher.pdfs.filter({ pdf in
                        pdf.internalName.contains($searchString.wrappedValue.lowercased())
                    })
                            , id: \._id) { pdf in
                        
                        if let parsedString = pdf.file?.split(separator: "-") {
                            let request = URLRequest(url: URL(string: "https://mylink/\(parsedString[1]).pdf")!)
                            
                            NavigationLink(destination: WebView(request: request)
                                            .navigationBarBackButtonHidden(backButtonHidden)
                                            .navigationBarHidden(backButtonHidden)
                                            .onTapGesture(perform: {
                                backButtonHidden.toggle()
                            })) {
                                HStack(alignment: .center) {
                                    Image(systemName: "doc")
                                        .padding()
                                        .frame(width: width, alignment: .leading)
                                        .lineLimit(1)
                                        .alignmentGuide(.leading, computeValue: { dimension in
                                            self.width = max(self.width ?? 0, dimension.width)
                                            return dimension[.leading]
                                        })
                                                            
                                    Text(pdf.internalName)
                                        .padding()
                                        .multilineTextAlignment(.leading)
                                        .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
                                }
                                .padding(.leading)
                            }
                        }
                    }
                    .navigationBarHidden(true)
                }
                .accentColor(Color.black)
                .onAppear{
                pdfsFetcher.pdfs == [] ? pdfsFetcher.fetchPDFs() : nil
                }
            }
        }
    }
}

Pdf 列表和搜索栏。

搜索栏焦点上的相同视图。

我希望搜索字符串过滤 pdf 列表,同时保持列表的可见性。

【问题讨论】:

标签: swift swiftui user-input textfield swiftui-navigationview


【解决方案1】:

我可以通过在我的应用程序中将@ObservableObject 设为@EnvironmentObject 来解决此问题:

@main
struct MyApp: App {
    @ObservedObject var pdfsFetcher = PDFsFetcher()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(pdfsFetcher)
        }
    }
}

struct AllPdfListView: View { 
    @EnvironmentObject var pdfsFetcher: PDFsFetcher
}

【讨论】:

  • 或者你可以把@ObservedObject改成@StateObject
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2022-11-25
  • 2020-09-17
  • 2021-10-06
相关资源
最近更新 更多