簡體   English   中英

帶有 SwiftUI 的錯誤顯示

[英]Bug display with SwiftUI

我有一個 SwiftUI 應用程序,有時會出現顯示錯誤。

我有一個 NavagigationView 可以這樣顯示:

它經常出現在設備上並且總是在模擬器上

但有時在設備中它看起來像這樣(頁面頂部的錯誤顯示):

錯誤出現在頁面頂部

我不明白這是從哪里來的。

編輯:這是此頁面的代碼:

struct FilesAdminView: View {
    @EnvironmentObject var session : SessionStore
    @ObservedObject var fileAdminViewModel : FileAdminViewModel = FileAdminViewModel()
    @State var showFilterPopUp : Bool = false
    
    @State var selected : Int = 0
    
    var body: some View {
        NavigationView{
            ZStack{
                VStack{
                        List(fileAdminViewModel.filesDisplay) { file in
                            
                            NavigationLink(destination: SingleFileView(singleFileViewModel: SingleFileViewModel(userId: self.session.session!.uid, file: file), selected: self.$selected)) {
                                VStack(spacing: 7){
                                    HStack{
                                        Text(file.nomDossier).font(Font.custom("Montserrat-Regular", size: 15))
                                        Spacer()
                                    }
                                    
                                
                                  
                       
                                    HStack {
                                        Spacer()
                                        Image(systemName: "circle.fill")
                                        Text("\(Constants.dicoEtatDisplay[file.etat]!)")
                                        
                                    }.font(.system(size: 12, weight: .light)).foregroundColor(Constants.dicoCouleurEtat[file.etat])
                                }
                                
                            }

                        }
                
                    }
                
                if showFilterPopUp {
                    GeometryReader{_ in
                        FilterPopUp(fileAdminViewModel: self.fileAdminViewModel, showFilterPopUp: self.$showFilterPopUp)
                    }.background(Color.black.opacity(0.65).edgesIgnoringSafeArea(.all).onTapGesture {
                        self.showFilterPopUp = false
                    })
                }
            }
            .navigationViewStyle(StackNavigationViewStyle())
            //.navigationBarHidden(false)
            .navigationBarTitle("Dossiers", displayMode: .inline)
            .navigationBarItems(leading:
                
                Image("Logo").resizable().frame(width: 100, height: 100)
                , trailing:
                HStack{
                    Button(action: {
                        self.showFilterPopUp = true
                    }) {
                        Image(systemName: "list.bullet").resizable().frame(width: 18, height: 18)
                    }
                    NavigationLink(destination: SettingsAdminView().environmentObject(self.session), label: {
                        Image(systemName: "gear").resizable().frame(width: 22 , height: 22)
                    })
                }
            )
        }.navigationViewStyle(StackNavigationViewStyle())
    }
}

原因肯定是因為使用ZStack作為頂視圖,但如果使用List ,它應該是List作為頂視圖...

這是一個解決方案(粗糙,由於缺少依賴關系而未測試),但想法應該很清楚。

struct FilesAdminView: View {
    @EnvironmentObject var session : SessionStore
    @ObservedObject var fileAdminViewModel : FileAdminViewModel = FileAdminViewModel()
    @State var showFilterPopUp : Bool = false

    @State var selected : Int = 0

    var body: some View {
        NavigationView{
            // List have to be the top view !!
            List(fileAdminViewModel.filesDisplay) { file in

                NavigationLink(destination: SingleFileView(singleFileViewModel: SingleFileViewModel(userId: self.session.session!.uid, file: file), selected: self.$selected)) {
                    VStack(spacing: 7){
                        HStack{
                            Text(file.nomDossier).font(Font.custom("Montserrat-Regular", size: 15))
                            Spacer()
                        }




                        HStack {
                            Spacer()
                            Image(systemName: "circle.fill")
                            Text("\(Constants.dicoEtatDisplay[file.etat]!)")

                        }.font(.system(size: 12, weight: .light)).foregroundColor(Constants.dicoCouleurEtat[file.etat])
                    }

                }

            }
            .navigationViewStyle(StackNavigationViewStyle())
                //.navigationBarHidden(false)
                .navigationBarTitle("Dossiers", displayMode: .inline)
                .navigationBarItems(leading:

                    Image("Logo").resizable().frame(width: 100, height: 100)
                    , trailing:
                    HStack{
                        Button(action: {
                            self.showFilterPopUp = true
                        }) {
                            Image(systemName: "list.bullet").resizable().frame(width: 18, height: 18)
                        }
                        NavigationLink(destination: SettingsAdminView().environmentObject(self.session), label: {
                            Image(systemName: "gear").resizable().frame(width: 22 , height: 22)
                        })
                    }
            )
        }.navigationViewStyle(StackNavigationViewStyle())
        .overlay {
            Group {
                if showFilterPopUp {      // << use popup in overlay her !!
                    GeometryReader{_ in
                        FilterPopUp(fileAdminViewModel: self.fileAdminViewModel, showFilterPopUp: self.$showFilterPopUp)
                    }.background(Color.black.opacity(0.65).edgesIgnoringSafeArea(.all).onTapGesture {
                        self.showFilterPopUp = false
                    })
                }
            }
        }
    }
}

我認為問題源於 View 具有可變數量的組成視圖。 具體來說,“FilterPopUp”僅在 showFilterPopUp=true 時出現。 試試這個或類似的方法,當 showFilterPopUp=false 時提供視圖。

            if showFilterPopUp {
                GeometryReader{_ in
                    FilterPopUp(fileAdminViewModel: self.fileAdminViewModel, showFilterPopUp: self.$showFilterPopUp)
                }.background(Color.black.opacity(0.65).edgesIgnoringSafeArea(.all).onTapGesture {
                    self.showFilterPopUp = false
                })
            } else {
                EmptyView()
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM