多次推送同一视图控制器实例异常swiftUI?
我在搜索多次推送同一视图控制器实例异常swiftUI?,swift,exception,swiftui,navigation,Swift,Exception,Swiftui,Navigation,我在搜索致命异常后单击选项卡栏时遇到以下异常:NSInvalidArgumentException多次推送同一视图控制器实例(),这是不受支持的,很可能是应用程序中的错误 我的SwiftUI代码如下: struct SearchView: View{ @State var searchText = "" @State var productSKU = "" @State var categoryID = "0&quo
致命异常后单击选项卡栏时遇到以下异常:NSInvalidArgumentException多次推送同一视图控制器实例(),这是不受支持的,很可能是应用程序中的错误
我的SwiftUI代码如下:
struct SearchView: View{
@State var searchText = ""
@State var productSKU = ""
@State var categoryID = "0"
@State var isPLPNavigate = false
@State var isKlevuSearch = false
@State var type = ""
@State var selectedProduct = SelectedProduct()
let trace = Performance.startTrace(name: "search_screen_rendering")
// @State private var navBarHidden = true
@Binding var navBarHidden : Bool
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@State var isSearchNavigate = false
@State var isPDPNavigate = false
@State var pdpviewmodel = ProductViewModel()
@State var devviewmodel = DeliveryViewModel()
@State var storeviewmodel = StoreListViewModel()
var vc: UIViewController? = nil
var dismissVC: (UIViewController) -> ()
var navigateEmptySearchPage: (String) -> ()
var categoryTapped: (String) -> ()
var viewPLPTapped: (String) -> ()
var screename : String = ""
func backBtnTapped() {
// self.navBarHidden = false
// if self.isKlevuSearch {
self.dismissVC(self.vc!)
// } else {
// self.presentationMode.wrappedValue.dismiss()
// }
}
func navigateSearchPage(text:String) {
self.searchText = text
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// self.navBarHidden = false
// }
// self.navBarHidden = false
// self.isSearchNavigate.toggle()
self.dismissVC(self.vc!)
self.navigateEmptySearchPage(self.searchText)
}
func productSelected(product:SelectedProduct) {
self.productSKU = product.sku
self.type = product.type
self.selectedProduct = product
self.isPDPNavigate.toggle()
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// self.navBarHidden = false
// }
}
func categoryTapped1(value:String) {
self.isKlevuSearch = false
self.categoryID = value
self.isPLPNavigate.toggle()
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// self.navBarHidden = false
// }
// self.dismissVC(self.vc ?? UIViewController())
// self.categoryTapped(self.categoryID)
}
func viewPLPTapped1(value: String) {
self.isKlevuSearch = true
self.searchText = value
self.isPLPNavigate.toggle()
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// self.navBarHidden = false
// }
// self.dismissVC(self.vc ?? UIViewController())
// self.viewPLPTapped(self.searchText)
}
var body: some View {
VStack {
NavigationLink(destination: PLPView(navBarHidden: self.$navBarHidden, searchText: self.searchText,screenname: "Search Screen", catId:Int(self.categoryID)!, isKlevuSearch: self.isKlevuSearch), isActive: self.$isPLPNavigate , label: {EmptyView()})
NavigationLink(destination:PDPScreenView(selectedProduct:self.selectedProduct,productID: productSKU,type:self.type), isActive: self.$isPDPNavigate , label: {EmptyView()})
// NavigationLink(destination:PDPView(viewModel: pdpviewmodel, viewModelStoreList: storeviewmodel, viewModelDelivery: devviewmodel, productID: productSKU), isActive: self.$isPDPNavigate , label: {EmptyView()})
// NavigationLink(destination:SearchEmptyView(searchText: self.searchText, navBarHidden: self.$navBarHidden), isActive: self.$isSearchNavigate , label: {EmptyView()})
SearchListView( backBtnTapped: self.backBtnTapped, productSelected:self.productSelected, navigateSearchPage:self.navigateSearchPage, categoryTapped:self.categoryTapped1, viewPLPTapped: self.viewPLPTapped1, screename: self.screename)
} .hideNavigationBar()
.showTabBar()
.onAppear(perform: {
// withAnimation {
self.navBarHidden = true
trace?.stop()
Analytics.logEvent("screen_view", parameters: [
"Firebase_Screen": "Search screen",
"ScreenName": "Search",
"ScreenClass": "Search screen"
])
//}
})
.onDisappear(perform: {
// // withAnimation {
if self.isPDPNavigate {
self.navBarHidden = false
}
// // }
})
}
}
struct SearchView:View{
@State var searchText=“”
@State var productSKU=“”
@状态变量categoryID=“0”
@状态变量isPLPNavigate=false
@状态变量isKlevuSearch=false
@State var type=“”
@状态变量selectedProduct=selectedProduct()
let trace=Performance.startTrace(名称:“搜索\屏幕\渲染”)
//@State private var navBarHidden=true
@绑定变量navBarHidden:Bool
@环境(\.presentationMode)变量presentationMode:绑定
@状态变量isSearchNavigate=false
@状态变量isPDPNavigate=false
@状态变量pdpviewmodel=ProductViewModel()
@状态变量devviewmodel=DeliveryViewModel()
@状态变量storeviewmodel=StoreListViewModel()
变量vc:UIViewController?=nil
var dismissVC:(UIViewController)->()
变量navigateEmptySearchPage:(字符串)->()
变量类别上限:(字符串)->()
var viewPLPTapped:(字符串)->()
var screename:String=“”
func backbtnapped(){
//self.navBarHidden=false
//如果self.isKlevuSearch{
self.dismissVC(self.vc!)
//}其他{
//self.presentationMode.wrappedValue.discouse()文件
// }
}
func navigateSearchPage(文本:字符串){
self.searchText=文本
//DispatchQueue.main.asyncAfter(截止日期:.now()+0.1){
//self.navBarHidden=false
// }
//self.navBarHidden=false
//self.isSearchNavigate.toggle()
self.dismissVC(self.vc!)
self.navigateemptysearch页面(self.search文本)
}
func productSelected(产品:SelectedProduct){
self.productSKU=product.sku
self.type=product.type
self.selectedProduct=产品
self.ispdpdNavigate.toggle()
//DispatchQueue.main.asyncAfter(截止日期:.now()+0.1){
//self.navBarHidden=false
// }
}
func categoryTapped1(值:字符串){
self.isKlevuSearch=false
self.categoryID=值
self.isPLPNavigate.toggle()
//DispatchQueue.main.asyncAfter(截止日期:.now()+0.1){
//self.navBarHidden=false
// }
//self.dismissVC(self.vc??UIViewController())
//self.categoryTapped(self.categoryID)
}
func viewPLPTapped1(值:字符串){
self.isKlevuSearch=true
self.searchText=值
self.isPLPNavigate.toggle()
//DispatchQueue.main.asyncAfter(截止日期:.now()+0.1){
//self.navBarHidden=false
// }
//self.dismissVC(self.vc??UIViewController())
//self.viewPLPTapped(self.searchText)
}
var body:一些观点{
VStack{
导航链接(目的地:PLPView(navBarHidden:self.$navBarHidden,searchText:self.searchText,屏幕名称:“搜索屏幕”,catId:Int(self.categoryID)!,isKlevuSearch:self.isKlevuSearch),isActive:self.$islpnavigate,标签:{EmptyView()})
导航链接(目标:PDPScreenView(selectedProduct:self.selectedProduct,productID:productSKU,类型:self.type),isActive:self.$isPDPNavigate,标签:{EmptyView()})
//导航链接(目标:PDPView(viewModel:pdpviewmodel,viewModelStoreList:storeviewmodel,viewModelDelivery:devviewmodel,productID:productSKU),isActive:self.$isPDPNavigate,标签:{EmptyView()})
//导航链接(目标:SearchEmptyView(searchText:self.searchText,navBarHidden:self.$navBarHidden),isActive:self.$isSearchNavigate,标签:{EmptyView()})
SearchListView(BackptTapped:self.BackptTapped,ProductSelf.productSelected,navigateSearchPage:self.navigateSearchPage,categoryTapped:self.categoryTapped1,ViewpTapped:self.ViewpTapped1,ScreenName:self.ScreenName)
}.hideNavigationBar()
.showtabar()
.onAppear(表演:{
//动画片{
self.navBarHidden=true
跟踪?.stop()
Analytics.logEvent(“屏幕视图”),参数:[
“Firebase_屏幕”:“搜索屏幕”,
“屏幕名称”:“搜索”,
“屏幕类别”:“搜索屏幕”
])
//}
})
.onDisappear(执行:{
////带动画{
如果self.isPDPNavigate{
self.navBarHidden=false
}
// // }
})
}
}
最后我找到了解决方案,添加以下代码以供我查看,它将解决该问题
.navigationViewStyle(StackNavigationViewStyle())
请在NavigationLink(目的地:PLPView(navBarHidden:self.$navBarHidden,searchText:self.searchText,屏幕名称:“搜索屏幕”,catId:Int(self.categoryID)!,isKlevuSearch:self.isKlevuSearch),isActive:self.$isPLPNavigate,标签:{EmptyView()})导航链接(目的地:PDPScreenView(selectedProduct:self.selectedProduct,productID:productSKU,type:self.type),isActive:self.$isPDPNavigate,标签:{EmptyView()})。在某个地方,您多次推同一个VC。@很好,但我为每个导航保留单独的布尔值。请提供搜索屏幕和选项卡栏的结构。