是否可以在SwiftUI中使模态不可驳回?

是否可以在SwiftUI中使模态不可驳回?,swiftui,Swiftui,我正在创建一个应用程序,其中登录/注册部分位于模式中,如果用户未登录,则会显示该模式 问题是,用户可以通过向下滑动来取消模式 有可能防止这种情况吗 var body: some View { TabView(selection: $selection) { App() }.sheet(isPresented: self.$showSheet) { // This needs to be non-dismissible LoginRegister()

我正在创建一个应用程序,其中登录/注册部分位于模式中,如果用户未登录,则会显示该模式

问题是,用户可以通过向下滑动来取消模式

有可能防止这种情况吗

var body: some View {
    TabView(selection: $selection) {
        App()
    }.sheet(isPresented: self.$showSheet) { // This needs to be non-dismissible
        LoginRegister()
    }
}
第二个例子:

我正在使用模态来询问信息。用户应无法退出此过程,除非通过使用“保存”按钮取消模式。用户必须在按钮工作之前输入信息。不幸的是,模式可以通过向下滑动来解除


有可能防止这种情况吗?

这是一个常见问题,也是一种“代码气味”。。。嗯,不是真正的代码,而是一种“设计模式的味道”

var body: some View {
    TabView(selection: $selection) {
        App()
    }.sheet(isPresented: self.$showSheet) { // This needs to be non-dismissible
        LoginRegister()
    }
}
问题是,您正在使您的登录过程成为应用程序其余部分的一部分

与其在
App
上显示
LoginRegister
,不如真正显示
App
LoginRegister

i、 e.您应该有一些状态对象,如
userLoggedIn:Bool
或其他什么,根据该值,您应该显示
App
LoginRegister


只是不要在视图层次结构中同时使用这两个属性。这样,您的用户将无法关闭视图。

您可以尝试使用
高优先级手势来完成此操作。当然,蓝色矩形仅用于演示,但您必须使用覆盖整个屏幕的视图

struct ModalViewNoClose : View {
    @Environment(\.presentationMode) var presentationMode

    let gesture = DragGesture()

    var body: some View {

        Rectangle()
            .fill(Color.blue)
            .frame(width: 300, height: 600)
            .highPriorityGesture(gesture)

            .overlay(
                VStack{
                    Button("Close") {
                        self.presentationMode.value.dismiss()
                    }.accentColor(.white)
                    Text("Modal")
                        .highPriorityGesture(gesture)
                    TextField("as", text: .constant("sdf"))
                        .highPriorityGesture(gesture)
                } .highPriorityGesture(gesture)
        )
            .border(Color.green)
    }
}
如果您不介意使用:

导入内省
@可用(iOS 13,*)
扩展视图{
///一个布尔值,指示视图控制器是否强制模式行为。
///
///此属性的默认值为“false”。如果将其设置为“true”,UIKit将忽略事件
///超出视图控制器的边界,并防止交互取消
///在屏幕上查看控制器。
公共函数isModalInPresentation(u值:Bool)->一些视图{
内省控制器{
$0.0 isModalInPresentation=价值
}
}
}
用法:

.sheet{
VStack{
...
}.Ismodalin演示文稿(正确)
}

理论上这可能会对你有所帮助(我没有尝试过)


好的,对不起,我心情不好!我知道我问了一个XY问题,但我在谷歌上找不到任何东西,我想可能有人已经试过了。我只是在试验,试图找出新的东西。正如我所说,这是一个示例用例。。。你是对的。。。我不知道我在做什么…@krjw不用担心,我会说,如果你在一个敏感应用程序(例如,银行/医疗)中“超时”用户,那么这样做并不是一个坏主意-如果用户在5分钟内没有使用它,在成功登录后以模式显示auth屏幕。这允许用户不会失去他们在应用程序中的位置。模态通常(和大多数情况一样)会被忽略。为什么不改变你的应用程序设计?使您的登录成为完整的
视图
?把它放在你想要的任何视图的顶部。现在,你有了100%的控制权(这是模态所没有的),并且可以(a)动画显示它,(b)保持它可见,直到你的代码要求取消它,以及(c)动画取消它。我会将此标记为答案,因为它最接近我所要求的。谢谢,效果很好!不幸的是,您仍然可以同时使用两个或多个手指来消除模态。有什么想法吗?@user1302387你解决了还是尝试了我的方法?
content
    .sheet(isPresented: isDisplayedBind) { some sheet }