当前位置: 首页 > 面试题库 >

防止在SwiftUI中解雇模式视图控制器

姚子石
2023-03-14
问题内容

在WWDC
2019上,Apple宣布了一种新的“卡式”外观模态演示,并带有内置手势,可通过向下滑动卡来消除模态视图控制器。他们还引入了新isModalInPresentation属性,UIViewController以便您可以选择拒绝这种解雇行为。

但是到目前为止,我还没有找到在SwiftUI中模拟这种行为的方法。使用.presentation(_ modal: Modal?),不,据我所知,让你以同样的方式禁止解雇手势。我还尝试将模式视图控制器放在内UIViewControllerRepresentable
View,但这似乎也无济于事:

struct MyViewControllerView: UIViewControllerRepresentable {
    func makeUIViewController(context: UIViewControllerRepresentableContext<MyViewControllerView>) -> UIHostingController<MyView> {
        return UIHostingController(rootView: MyView())
    }

    func updateUIViewController(_ uiViewController: UIHostingController<MyView>, context: UIViewControllerRepresentableContext<MyViewControllerView>) {
        uiViewController.isModalInPresentation = true
    }
}

即使出现了,.presentation(Modal(MyViewControllerView()))我仍然可以向下滑动以消除视图。当前是否可以使用现有的SwiftUI构造来做到这一点?


问题答案:

通过更改gesture priority您不想拖动的DragGesture任何视图的,可以防止出现在任何视图上。例如对于Modal,可以按以下方式完成:

也许这不是最佳做法,但是效果很好

struct ContentView: View {

@State var showModal = true

var body: some View {

    Button(action: {
        self.showModal.toggle()

    }) {
        Text("Show Modal")
    }.sheet(isPresented: self.$showModal) {
        ModalView()
    }
  }
}
struct ModalView : View {
@Environment(\.presentationMode) var presentationMode

let dg = DragGesture()

var body: some View {

    ZStack {
        Rectangle()
            .fill(Color.white)
            .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
            .highPriorityGesture(dg)

        Button("Dismiss Modal") {
            self.presentationMode.wrappedValue.dismiss()
        }
    }
  }
}


 类似资料:
  • 问题内容: 我增加了一个,这似乎为。在关闭之前,我想验证的输入。基于验证,我想关闭还是不关闭。但是我不知道如何防止按下按钮时的关闭动作。有没有人解决了这个问题或从哪里开始的任何想法?我去了谷歌,但没有运气:/谢谢! 问题答案: 您是正确的:如果用户可以点击警报中的按钮,则警报将被关闭。因此,您要防止用户点击按钮!只需禁用UIAlertAction按钮即可。如果禁用了警报操作,则用户无法点击它以将其

  • 我有一个视图控制器,这是导航控制器的rootVc。 我需要为rootview控制器隐藏导航栏,因此我使用以下方法来隐藏它并使其重新出现。 我基本上是在rootVc中隐藏导航栏,并为所有其他视图控制器显示它。 但当我移除导航栏时,我看到我的内容正在状态栏下扩展 有办法解决这个问题吗?

  • 我在理解容器视图控制器的实现方式时遇到了一些麻烦。 我将一个容器拖到主视图控制器中,它会自动创建嵌入式视图控制器,并通过嵌入式segue连接。然后,我可以通过从主视图控制器访问它。 我有点困惑,在飞行中创建和使用这些。即我想用它作为警报视图。我是否只是初始化视图一次,然后在每次显示被触发时更改其内容?我应该调用或只是设置隐藏/动画视图进出? 发音有困难。希望有人会说新语,能理解我。

  • CodeIgniter 的开发基于 MVC(模型-视图-控制器)设计模式。MVC 是一种 用于将应用程序的逻辑层和表现层分离出来的软件方法。在实践中,由于这种分离 所以你的页面中只包含很少的 PHP 脚本。 模型 代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。 视图 是要展现给用户的信息。一个视图通常就是一个网页,但是在 CodeIgniter 中, 一个视图也可以是一

  • 模型视图控制器是最常用的设计模式。 开发人员发现实现这种设计模式很容易。 以下是模型视图控制器的基本架构 - 现在让我们看看结构是如何工作的。 模型 (Model) 它由纯应用程序逻辑组成,它与数据库交互。 它包括向最终用户表示数据的所有信息。 View View表示与最终用户交互的HTML文件。 它向用户表示模型的数据。 控制器 (Controller) 它充当视图和模型之间的中介。 它侦听由视

  • 问题内容: 我正在尝试使用以下代码弹出到根视图控制器: 这通常可行,但是当当前视图是模式视图时,尝试使用此代码时出现错误。在这种情况下,我该如何跳回到根视图控制器? 提前致谢。 问题答案: 您可以检查当前控制器是否存在,如果存在,则将其关闭,然后直接转到当前控制器。