SwiftUI模态表示仅可从navigationBarItems进行一次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中。

这里有什么解决方法可以使按钮起作用?

编辑:

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

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

答案

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

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

“

这里是一个修复程序(当然,解决方法是安全的,因为即使在解决问题之后,它仍会继续工作)。这个想法不是与残缺的布局作斗争,而是创建另一个按钮,因此布局引擎本身会删除旧的不良按钮并添加新的刷新布局。众所周知的工具-使用.id()

“

修改后的代码:

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()
            
            .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进行一次的主要内容,如果未能解决你的问题,请参考以下文章

从 swiftUI 中的另一个视图中关闭模态视图

SwiftUI:自定义模态动画

SwiftUI - 通过 ContextMenu 呈现模态

如何使用 SwiftUI 在模态视图中创建 NSManagedObject?

SwiftUI 中的透明和模糊 fullScreenCover 模态?

SwiftUI:从模态框内转到新视图