如何在 SwiftUI 中使模态不可关闭

Posted

技术标签:

【中文标题】如何在 SwiftUI 中使模态不可关闭【英文标题】:How to make modal non-dismissible in SwiftUI 【发布时间】:2020-02-12 08:53:55 【问题描述】:

我正在创建一个应用程序,我在其中创建了第一个屏幕(它将是应用程序的简短描述),并且在屏幕上我有一个下一个按钮,如果我点击下一个按钮,它应该被关闭,否则它也不能被关闭下拉。

如果用户拉下一张纸,它应该再次重新定位。

问题是,用户可以通过向下滑动模式来关闭模式,并且应用程序仪表板屏幕显示应该被阻止。

我们如何防止通过下拉关闭模型。

struct ModalView : View 

    @Environment(\.presentationMode) var presentationMode

    var body: some View 

        Rectangle()
            .fill(Color.orange)
            .frame(width: 400, height: 650)
            .overlay(
                VStack
                    Button(action: 
                        self.presentationMode.wrappedValue.dismiss()
                    ) 
                        HStack 
                            Image(systemName: "chevron.left")
                            Text("Dismiss")
                        .padding(10.0)
                        .overlay(
                            RoundedRectangle(cornerRadius: 10.0)
                                .stroke(lineWidth: 2.0)
                        )
                    .accentColor(.white)
                )
            .border(Color.blue)
            .gesture( DragGesture())
    

内容视图

struct ContentView: View 

    //MARK: Properties
    //isPresented:- Present's a Welcome Screen in the form of cards.
    @State private var isPresented = true
    var body: some View 

        VStack
            DashboardView()
                .sheet(isPresented: $isPresented)
                    //IntroductionView(isPresentingSheet: self.$isPresented)
                    ModalView()
            
        
    

仪表板视图

struct DashboardView: View 

    var body: some View 
        Text("Hello SwiftUI")
    

【问题讨论】:

【参考方案1】:

你可以试试这个解决方案:

struct ModalWrapper: View 

    var body: some View 
        ModalView().highPriorityGesture(DragGesture())
    



struct ModalView : View 

    @Environment(\.presentationMode) var presentationMode

    var body: some View 

        Rectangle()
            .fill(Color.orange)
            .frame(width: 400, height: 650)
            .overlay(
                VStack
                    Button(action: 
                        self.presentationMode.wrappedValue.dismiss()
                    ) 
                        HStack 
                            Image(systemName: "chevron.left")
                            Text("Dismiss")
                        .padding(10.0)
                        .overlay(
                            RoundedRectangle(cornerRadius: 10.0)
                                .stroke(lineWidth: 2.0)
                        )
                    .accentColor(.white)
                )
            .border(Color.blue)
            .highPriorityGesture(DragGesture())
    


struct ContentView: View 

    //MARK: Properties
    //isPresented:- Present's a Welcome Screen in the form of cards.
    @State private var isPresented = true
    var body: some View 

        VStack
            DashboardView()
                .sheet(isPresented: $isPresented)
                    //IntroductionView(isPresentingSheet: self.$isPresented)
                    ModalWrapper()
            
        
    


struct DashboardView: View 

    var body: some View 
        Text("Hello SwiftUI")
    


这里我添加了ModalWrapper 用于包装模态视图,否则您必须将highPriorityGesture(DragGesture()) 添加到ModalView 的所有子视图中,所以最好保留一个包装视图。

希望这会对你有所帮助。

【讨论】:

当我下拉或(Drag Down ModalView,它正在关闭。它不应该关闭。当我单击关闭按钮时,ModelView 屏幕应该关闭。 请试试这个对我有用的解决方案。我正在使用 Xcode 11.3.1 并在 ios13 和 lator 中进行了测试。【参考方案2】:

这里有更优雅的答案:Prevent dismissal of modal view controller in SwiftUI

(不看接受的)

【讨论】:

以上是关于如何在 SwiftUI 中使模态不可关闭的主要内容,如果未能解决你的问题,请参考以下文章

在 Swiftui 中如何通过旋转到横向自动关闭模态

如何防止工作表在 SwiftUI 中使其后面的视图变暗或删除不必要的填充?

如何在 SwiftUI 中使列表更宽?

如何在 SwiftUI 中使 UIViewRepresentable 在 tvOS 上具有焦点?

如何在 tvOS 中使 SwiftUI 列表可滚动

如何在 SwiftUI 中使整个列表行成为 NavigationLink