多次推送同一视图控制器实例异常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。@很好,但我为每个导航保留单独的布尔值。请提供搜索屏幕和选项卡栏的结构。