SwiftUI模态表示只能在navigationBarItems中工作一次
当您从导航栏
项目中的按钮显示模式时,这是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)
回答:
好吧,问题出
在工作表关闭后导航栏按钮的布局不正确(似乎打破了约束)
在视图层次结构调试中清晰可见:
这是一个修复程序(当然,解决方法是安全的,因为即使在解决问题后,它仍可以继续工作)。这个想法不是与残缺的布局作斗争,而只是创建另一个按钮,因此布局引擎本身会删除旧的不良按钮
并添加新的刷新布局。众所周知的仪器-使用.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()
}
}
}
}
以上是 SwiftUI模态表示只能在navigationBarItems中工作一次 的全部内容, 来源链接: utcz.com/qa/416192.html