【发布时间】: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