【问题标题】:How to make modal non-dismissible in SwiftUI如何在 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")
    }
}

【问题讨论】:

    标签: user-interface model-view-controller view 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

    (不看接受的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 2021-05-04
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 2019-10-24
      相关资源
      最近更新 更多