[英]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.