SwiftUI中有一个bug,当你在导航栏项目中显示modal from button时。在下面的代码中,按钮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)
}
}
}
字符串
这个bug是从去年年中开始的,它仍然存在于Xcode 11.3.1 + iOS 13.3模拟器和iOS 13.3.1 iPhone XS中。
这里有没有让按钮工作的解决方法?
编辑:
1.似乎是点击区域去某处向下,它是可能的点击下面的按钮显示模态。
临时解决方案是使用内联导航栏模式:第一个月
2条答案
按热度按时间nr9pn0ug1#
嗯,问题是在坏布局(似乎打破约束)的导航栏按钮后,工作表已关闭
它在视图层次结构调试中清晰可见:
x1c 0d1x的数据
这是一个修复方法(当然是变通方法,但很安全,因为即使问题得到修复,它也会继续工作)。我们的想法是不与破碎的布局战斗,但只是创建另一个按钮,所以布局引擎本身删除旧的坏按钮,并添加新的一个令人耳目一新的布局。用于此目的的工具非常有名-使用
.id()
的
修改代码:
字符串
xu3bshqb2#
谢谢你的Asperi回答,但仍然有一个错误。
他说使用
id
,但是当NavigationView
中有一个scroll
时,我们刷新这个id,滚动到顶部。您可以使用下面的解决方案。
字符串