在SwiftUI Modal中禁用拖动以关闭

时间:2019-06-11 04:06:51

标签: swiftui

我已经介绍了一个模态视图,但是我希望用户经历一些步骤后才能将其关闭。 当前可以拖动视图以将其关闭。

有没有办法阻止这种可能性?

我已经看过WWDC会议视频,他们提到了它,但是我似乎没能确切地知道我需要的代码。

struct OnboardingView2 : View {

    @Binding
    var dismissFlag: Bool

    var body: some View {

        VStack {
            Text("Onboarding here! ??")
            Button(action: {
                self.dismissFlag.toggle()
            }) {
                Text("Dismiss")
            }
        }
    }
}

我目前有一些文字和一个按钮,以后会用它来关闭视图。

7 个答案:

答案 0 :(得分:2)

如果您使用第三方库Introspect,这很容易,这非常有用,因为它可以轻松访问相应的UIKit组件。在这种情况下,(?: : begin non-capture group \$ : match '$' | : or \G : assert position at the end of the previous match ) : end non-capture group \d+? : match 1+ digits \K : reset starting point of match and no longer include previously-consumed characters in reported match (?= : begin positive lookahead (?:\d{3}) : match 3 digits in a non-capture group + : execute non-capture group 1+ times $ : match end of string ) : end positive lookahead 中的属性:

UIViewController

答案 1 :(得分:1)

iOS 15

从 iOS 15 开始,我们可以使用 interactiveDismissDisabled

func interactiveDismissDisabled(_ isDisabled: Bool = true) -> some View

我们只需要将它附加到工作表上。以下是来自 documentation 的示例:

struct PresentingView: View {
    @Binding var showTerms: Bool

    var body: some View {
        AppContents()
            .sheet(isPresented: $showTerms) {
                Sheet()
            }
    }
}

struct Sheet: View {
    @State private var acceptedTerms = false
    
    var body: some View {
        Form {
            Button("Accept Terms") {
                acceptedTerms = true
            }
        }
        .interactiveDismissDisabled(!acceptedTerms)
    }
}

答案 2 :(得分:0)

我有一个类似的问题here

struct Start : View {
let destinationView = SetUp()
    .navigationBarItem(title: Text("Set Up View"), titleDisplayMode: .automatic, hidesBackButton: true)

var body: some View {
    NavigationView {
        NavigationButton(destination: destinationView) {
            Text("Set Up")

        }
    }
}
}

这里最主要的是它隐藏了后退按钮。这将关闭“后退”按钮,并使其变为使用户无法向后滑动以太坊。

对于应用程序的设置部分,您可以创建一个新的SwiftUI文件,并添加一个类似的东西回家,同时还可以合并自己的设置代码。

struct SetUp : View {

    let destinationView = Text("Your App Here")
        .navigationBarItem(title: Text("Your all set up!"), titleDisplayMode: .automatic, hidesBackButton: true)

 var body: some View {
    NavigationView {
        NavigationButton(destination: destinationView) {
            Text("Done")

        }
    }
}
}

答案 3 :(得分:0)

不确定这是否有助于显示正在使用的模态,甚至不确定显示使用的模态的方法,但是当您使用UIViewControllerUIHostingController呈现SwiftUI视图时

let vc = UIHostingController(rootView: <#your swiftUI view#>(<#your parameters #>))

您可以设置modalPresentationStyle。您可能需要决定哪种样式适合您的需求,但是.currentContext可以防止拖动来消除。

旁注:我不知道如何消除从UIHostingController发出的视图,这就是为什么我亲自问问Q来找出?的原因

答案 4 :(得分:0)

当前如何在SwiftUI中禁用拖动以关闭以解决以下问题:

Is it possible to make a modal non-dismissible in SwiftUI?

答案 5 :(得分:0)

您可以使用此答案并在一些消除步骤后对其进行自定义: https://stackoverflow.com/a/58393024/8397245

答案 6 :(得分:-1)

https://gist.github.com/mobilinked/9b6086b3760bcf1e5432932dad0813c0

进行了扩展,以使控制模态排放变得毫不费力。

Apple正式解决方案发布之前的临时解决方案。

/// Example:
struct ContentView: View {
    @State private var presenting = false
    
    var body: some View {
        VStack {
            Button {
                presenting = true
            } label: {
                Text("Present")
            }
        }
        .sheet(isPresented: $presenting) {
            ModalContent()
                .allowAutoDismiss { false }
                // or
                // .allowAutoDismiss(false)
        }
    }
}