SwiftUI模态表示仅在navigationBarItems中工作一次

nuypyhwy  于 2023-08-02  发布在  Swift
关注(0)|答案(2)|浏览(146)

SwiftUI中有一个bug,当你在导航栏项目中显示modal from button时。在下面的代码中,按钮1按预期工作,但按钮2只工作一次:

  1. struct DetailView: View {
  2. @Binding var isPresented: Bool
  3. @Environment (\.presentationMode) var presentationMode
  4. var body: some View {
  5. NavigationView {
  6. Text("OK")
  7. .navigationBarTitle("Details")
  8. .navigationBarItems(trailing: Button(action: {
  9. self.isPresented = false
  10. // or:
  11. // self.presentationMode.wrappedValue.dismiss()
  12. }) {
  13. Text("Done").bold()
  14. })
  15. }
  16. }
  17. }
  18. struct ContentView: View {
  19. @State var showSheetView = false
  20. var body: some View {
  21. NavigationView {
  22. Group {
  23. Text("Master")
  24. Button(action: { self.showSheetView.toggle() }) {
  25. Text("Button 1")
  26. }
  27. }
  28. .navigationBarTitle("Main")
  29. .navigationBarItems(trailing: Button(action: {
  30. self.showSheetView.toggle()
  31. }) {
  32. Text("Button 2").bold()
  33. })
  34. }.sheet(isPresented: $showSheetView) {
  35. DetailView(isPresented: self.$showSheetView)
  36. }
  37. }
  38. }

字符串
这个bug是从去年年中开始的,它仍然存在于Xcode 11.3.1 + iOS 13.3模拟器和iOS 13.3.1 iPhone XS中。
这里有没有让按钮工作的解决方法?
编辑:
1.似乎是点击区域去某处向下,它是可能的点击下面的按钮显示模态。
临时解决方案是使用内联导航栏模式:第一个月

nr9pn0ug

nr9pn0ug1#

嗯,问题是在坏布局(似乎打破约束)的导航栏按钮后,工作表已关闭
它在视图层次结构调试中清晰可见:
x1c 0d1x的数据
这是一个修复方法(当然是变通方法,但很安全,因为即使问题得到修复,它也会继续工作)。我们的想法是不与破碎的布局战斗,但只是创建另一个按钮,所以布局引擎本身删除旧的坏按钮,并添加新的一个令人耳目一新的布局。用于此目的的工具非常有名-使用.id()



修改代码:

  1. struct ContentView: View {
  2. @State var showSheetView = false
  3. @State private var navigationButtonID = UUID()
  4. var body: some View {
  5. NavigationView {
  6. Group {
  7. Text("Master")
  8. Button(action: { self.showSheetView.toggle() }) {
  9. Text("Button 1")
  10. }
  11. }
  12. .navigationBarTitle("Main")
  13. .navigationBarItems(trailing: Button(action: {
  14. self.showSheetView.toggle()
  15. }) {
  16. Text("Button 2").bold() // recommend .padding(.vertical) here
  17. }
  18. .id(self.navigationButtonID)) // force new instance creation
  19. }
  20. .sheet(isPresented: $showSheetView) {
  21. DetailView(isPresented: self.$showSheetView)
  22. .onDisappear {
  23. // update button id after sheet got closed
  24. self.navigationButtonID = UUID()
  25. }
  26. }
  27. }
  28. }

字符串

展开查看全部
xu3bshqb

xu3bshqb2#

谢谢你的Asperi回答,但仍然有一个错误。
他说使用id,但是当NavigationView中有一个scroll时,我们刷新这个id,滚动到顶部。
您可以使用下面的解决方案。

  1. content
  2. .onDisappear {
  3. let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
  4. if let viewFrame = scene?.windows.first?.rootViewController?.view.frame {
  5. scene?.windows.first?.rootViewController?.view.frame = .zero
  6. scene?.windows.first?.rootViewController?.view.frame = viewFrame
  7. }
  8. }

字符串

相关问题