【问题标题】:Pushing the same view controller instance more than once exception swiftUI?多次推送同一个视图控制器实例异常swiftUI?
【发布时间】:2021-04-21 06:27:57
【问题描述】:

搜索Fatal Exception: NSInvalidArgumentException <_TtGC7SwiftUI41StyleContextSplitViewNavigationControllerVS_19SidebarStyleContext_: 0x10493aa00> is pushing the same view controller instance (<_TtGC7SwiftUI41StyleContextSplitViewNavigationControllerVS_14NoStyleContext_: 0x104959000>) more than once which is not supported and is most likely an error in the application后点击标签栏出现以下异常

我的 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
            }
//          //  }
        })
      
        
    }

    
}

【问题讨论】:

  • 请在 NavigationLink(destination: PLPView(navBarHidden: self.$navBarHidden, searchText: self.searchText,screenname: "Search Screen", catId:Int(self.categoryID)!, isKlevuSearch) 检查您的代码: self.isKlevuSearch), isActive: self.$isPLPNavigate, 标签: {EmptyView()}) NavigationLink(destination:PDPScreenView(selectedProduct:self.selectedProduct,productID: productSKU,type:self.type), isActive: self.$isPDPNavigate ,标签:{EmptyView()})。你在某个地方多次推动同一个 VC。
  • @Kudos 但我为每个导航维护单独的布尔值
  • 请提供您的搜索屏幕和标签栏的结构。

标签: swift exception swiftui navigation


【解决方案1】:

最后我找到了解决方案,为我的视图添加以下代码将解决该问题

 .navigationViewStyle(StackNavigationViewStyle())

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2011-01-03
    • 2016-05-26
    • 2021-06-03
    • 2020-08-30
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多