【发布时间】:2020-10-06 04:53:48
【问题描述】:
晚上好,
在这里,我想讨论一种奇怪的情况。我在 SwiftUI 中制作应用程序,并且从模态导航开始出现问题。
这里是我的代码示例:
类别列表视图
struct CategoriesListView: View {
@ObservedObject var viewModel: CategoriesListViewModel
@State private var searchedText = ""
@State private var showCancelButton: Bool = false
@GestureState private var dragOffset = CGSize.zero
var body: some View {
GeometryReader { [weak viewModel] geometry in
NavigationView {
ZStack(alignment: .leading) {
GeometryReader { geo in
Image("bg_shape")
.frame(width: geo.size.width, height: geo.size.height)
.position(x: geo.size.width / 2, y: geo.size.height / 4)
}
self.content(viewModel: viewModel)
}.navigationBarTitle("Categories", displayMode: .automatic)
.animation(.easeOut(duration: 0.3))
.navigationBarHidden(self.showCancelButton)
.navigationBarItems(leading: Button(action: {
viewModel?.dismiss.send(())
}) {
Image("button_arrow")
},trailing: Image("logo"))
.gesture(DragGesture().updating(self.$dragOffset, body: { (value, state, transaction) in
if(value.startLocation.x < 20 && value.translation.width > 100) {
viewModel?.dismiss.send(())
}
}))
}
}
}
CategoryProductsListView
struct CategoryProductsList: View {
@Environment(\.viewController) var viewRepresentative
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@ObservedObject var viewModel: CategoryProductListViewModel
@State private var searchedText = ""
@State private var showCancelButton: Bool = false
@State private var showModal: Bool = false
@GestureState private var dragOffset = CGSize.zero
var body: some View {
GeometryReader { [weak viewModel] geometry in
ZStack(alignment: .leading) {
GeometryReader { geo in
Image("bg_shape")
.frame(width: geo.size.width, height: geo.size.height)
.position(x: geo.size.width / 2, y: geo.size.height / 4)
}
self.content(viewModel: viewModel)
}.navigationBarTitle("Products", displayMode: .automatic)
.navigationBarHidden(self.showCancelButton)
.navigationBarBackButtonHidden(true)
.navigationBarItems(leading: Button(action: {
UITableView.appearance().rowHeight = UITableView.automaticDimension
self.presentationMode.wrappedValue.dismiss()
}) {
Image("button_arrow")
},trailing: Image("logo"))
.gesture(DragGesture().updating(self.$dragOffset, body: { (value, state, transaction) in
if(value.startLocation.x < 20 && value.translation.width > 100) {
UITableView.appearance().rowHeight = UITableView.automaticDimension
self.presentationMode.wrappedValue.dismiss()
}
}))
}.blur(radius: self.showModal ? 4 : 0)
}
这是我的堆栈导航示例:
CategoriesListView -> CategoryProductsListView -> ProductDetailView
在 ProductDetaliView 上我有按钮,它关闭屏幕。
Button(action: {
self.presentationMode.wrappedValue.dismiss()}) {
Image("button_close")
}.buttonStyle(PlainButtonStyle()))
情况一:
当我以模态方式呈现 ProductDetailView,并使用关闭按钮,然后返回 CategoriesListView,一切正常。
情况2: 当我以 ProductDetailView 模式呈现时,并使用向下滑动关闭屏幕,然后我返回 CategoriesListView,它会在没有任何登录屏幕的情况下崩溃应用程序。
这似乎是 Swift UI 上的一个错误,但我没有找到任何有关它的信息。如果您知道它可能是什么,请提供帮助。
祝你有美好的一天!
编辑:
几个小时后,我找到了解决方案,问题在于改变 UINavigationBar 的外观。
结束题
【问题讨论】:
-
Thread 1: EXC_BAD_INSTRUCTION 异常是 99,99% 的开发人员错误。设置异常断点以获取更多信息。
-
@vadian 在我在这里写问题之前我先做了,什么也没做。我选择了所有例外,什么都没有:(
-
如果问题得到解决,请给出解决方案作为答案。不要将答案嵌入问题中。
-
帮助进一步解决该错误,单击出现异常的线程并在控制台底部键入
$arg1,这应该会输出实际错误。