当您从导航栏 项目中的按钮显示模式时,这是SwiftUI中的错误。在下面的代码中,按钮1可以正常工作,但是按钮2只能工作一次:
struct DetailView: View { @Binding var isPresented: Bool @Environment (\.presentationMode) var presentationMode var body: some View { NavigationView { Text("OK") .navigationBarTitle("Details") .navigationBarItems(trailing: Button(action: { self.isPresented = false // or: // self.presentationMode.wrappedValue.dismiss() }) { Text("Done").bold() }) } } } struct ContentView: View { @State var showSheetView = false var body: some View { NavigationView { Group { Text("Master") Button(action: { self.showSheetView.toggle() }) { Text("Button 1") } } .navigationBarTitle("Main") .navigationBarItems(trailing: Button(action: { self.showSheetView.toggle() }) { Text("Button 2").bold() }) }.sheet(isPresented: $showSheetView) { DetailView(isPresented: self.$showSheetView) } } }
该错误来自去年年中,至今仍存在于Xcode 11.3.1 + iOS 13.3 Simulator和iOS 13.3.1 iPhone XS中。
这里有任何解决方法可以使按钮起作用?
编辑:
似乎要点击的区域下降到某个地方,可以点击下面的按钮以显示模式。 临时解决方案是使用嵌入式导航栏模式: .navigationBarTitle("Main", displayMode: .inline)
.navigationBarTitle("Main", displayMode: .inline)
好吧,问题出 在工作表关闭后导航栏按钮的布局不正确(似乎打破了约束)
在视图层次结构调试中清晰可见:
这是一个修复程序(当然,解决方法是安全的,因为即使在解决问题后,它仍可以继续工作)。这个想法不是与残缺的布局作斗争,而只是创建另一个按钮,因此布局引擎本身会删除旧的不良按钮 并添加新的刷新布局。众所周知的仪器-使用.id()
演示2
修改后的代码:
struct ContentView: View { @State var showSheetView = false @State private var navigationButtonID = UUID() var body: some View { NavigationView { Group { Text("Master") Button(action: { self.showSheetView.toggle() }) { Text("Button 1") } } .navigationBarTitle("Main") .navigationBarItems(trailing: Button(action: { self.showSheetView.toggle() }) { Text("Button 2").bold() // recommend .padding(.vertical) here } .id(self.navigationButtonID)) // force new instance creation } .sheet(isPresented: $showSheetView) { DetailView(isPresented: self.$showSheetView) .onDisappear { // update button id after sheet got closed self.navigationButtonID = UUID() } } } }