SwiftUI 模式演示只能从 navigationBarItems 工作一次

avd*_*hin 8 ios swift swiftui

当您从导航栏项目内的按钮显示模式时,这是 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个bug是去年年中的,现在还在Xcode 11.3.1 + iOS 13.3 Simulator和iOS 13.3.1 iPhone XS中。

这里有任何使按钮工作的解决方法吗?

编辑:

  1. 似乎点击区域向下某处,可以点击下面的按钮以显示模态。

临时解决方案是使用内联导航栏模式: .navigationBarTitle("Main", displayMode: .inline)

Asp*_*eri 13

好吧,问题在于工作表关闭后导航栏按钮的布局不正确(似乎约束被破坏)

在视图层次结构调试中清晰可见:

演示

这是一个修复程序(当然是解决方法,但安全,因为即使问题得到修复,它仍将继续工作)。这个想法不是与损坏的布局作斗争,而只是创建另一个按钮,因此布局引擎本身删除旧的坏按钮并添加新的刷新布局。这个工具是众所周知的 - 使用.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()
                }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在 Xcode 12.5 (12E262) 中仍然存在此问题 (4认同)
  • Xcode 13.0 beta (13A5154h) – 仍然看到这个问题。 (2认同)