SwiftUI 模态视图

2024-05-01

从任何类或结构中模态显示 SwiftUI 视图的最佳方式是什么?我使用 UIKit 中的 UIHostingController。有没有更好的方法只使用 SwiftUI 来做到这一点?

带有用于呈现 SwiftUI 视图的按钮的 ContentView

struct ContentView: View {
    var body: some View {
        Button {
            //  Present the view
            presentView(controller: UIHostingController(rootView: view))
        } label: {
            Text("Present view")
        }
    }
    
    var view: some View {
        Button {
            //  Dismiss the view
            dismissView()
        } label: {
            Rectangle()
                .overlay(
                    Text("Dismiss view")
                )
        }
    }
}

用于呈现 SwiftUI 视图的函数

extension ContentView {
    //  Returns the top view controller
    func topViewController() -> UIViewController? {
        let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
        if var topController = keyWindow?.rootViewController {
            while let presentedViewController = topController.presentedViewController { topController = presentedViewController }
            return topController
        } else { return nil }
    }
    
    //  Presents the SwiftUI view in a UIHostingController
    func presentView(controller: UIViewController) {
        controller.view.backgroundColor = .none
        controller.modalPresentationStyle = .overCurrentContext
        topViewController()?.present(controller, animated: false, completion: nil)
    }
    
    //  Removes the UIHostingViewController from root view
    func dismissView() {
        topViewController()?.dismiss(animated: false, completion: nil)
    }
}

您可以像这样呈现模态表:

struct ContentView: View {
   @State private var showSheet = false

   var body: some View {
       Button("Present") { 
           showSheet.toggle() 
       }.font(.largeTitle)
       .sheet(isPresented: $showSheet) { 
           SheetView() 
       }
    }
}

struct SheetView: View {
   @Environment(\.dismiss) var dismiss

    var body: some View {
        ZStack {
           Button { 
              dismiss() 
           } label: {
               Image(systemName: "xmark.circle")
                 .font(.largeTitle)
                 .foregroundColor(.gray)
           }
         }
         .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
         .padding()
    }
}

或者像这样在全屏上呈现模式:

struct ContentView: View {
   @State private var showSheet = false

   var body: some View {
       Button("Present") { 
          showSheet.toggle() 
       }.font(.largeTitle)
        .fullScreenCover(isPresented: $showSheet) {
              SheetView()
       }
   }
}
   
struct SheetView: View {
    @Environment(\.presentationMode) var presentationMode
 
     var body: some View {
    
         ZStack {
            Button { 
               presentationMode.wrappedValue.dismiss() 
             } label: {
                Image(systemName: "xmark.circle")
                .font(.largeTitle)
                .foregroundColor(.gray)
             }
       }
        .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing) 
        .padding()
   }
}

对于您的评论没有问题,您可以这样做:

struct ContentView: View {
    @State private var showSheet = false

    var body: some View {
        ZStack {
            Button("Present") {
                showSheet.toggle()
            }
            .font(.largeTitle)
        
            if showSheet {
                ZStack {
                    Button {
                        showSheet.toggle()
                    } label: {
                        Image(systemName: "xmark.circle")
                            .font(.largeTitle)
                            .foregroundColor(.gray)
                    }
                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
                    .padding()
                }
                .background(.ultraThickMaterial)
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI 模态视图 的相关文章

  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 如何在 SwiftUI 中使用带条件检查的按钮进行导航

    Since 导航按钮不再可用 我如何检查条件导航链接为了导航到另一个视图 NavigationLink destination Dashboard userName self userId password self password is
  • Swift:检查 UISearchBar.text 是否包含 url

    如何检查 UISearchBar text 是否包含 URL 我想做这样的事情 if searchBar text NSTextCheckingType Link 但我收到错误 String is not convertible to NS
  • Apple Developer 应用程序门户不再可以生成新的 Bundle Seed ID

    iOS 开发者门户中的新界面不再为您的应用程序 ID 提供 生成新的 按钮 取而代之的是 使用团队 ID 这将导致使用相同的种子 ID 任何人都知道为什么要进行更改以及您应该如何使用新的捆绑包种子 ID 随意补一些 不再可能生成新的种子 I
  • 带约束的嵌套集合视图的意外行为 (Swift 4)

    我的表格视图中有一个单元格 其中包含水平分页集合视图 该集合视图的每个页面内都有一个垂直集合视图 为了避免 滚动滚动 问题 我在垂直集合视图中禁用了垂直滚动 垂直集合视图的单元格计数不是静态的 可以是任意数字 因此 这会产生一个问题 集合视
  • 在 github 上下载 ZIP 时没有 .xcodeproj 文件

    我正在尝试将我的 GitHub 项目放入 Xcode 中 当我从 GitHub 下载时 zip 文件不包含任何 xcodeproj 文件 另外 即使我在 xcode 上登录 GitHub 克隆 下载时也没有 在 Xcode 中打开 选项 如
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • 访问 google reader 的 Endpoints API 时出错

    我正在尝试在iPhone APP中实现google reader 到目前为止我已经成功收到了sid and auth 当我尝试使用以下命令调用 Endpoints API 时 问题就出现了GET 这是代码 ASIHTTPRequest re
  • 为arm64或arm7s编译OpenSSL FIPS功能库时出现未知的cpu类型

    我可以成功 至少没有警告并生成 a 文件 针对 arm7 x86 64 和 i386 进行编译 当我编译arm64时 我得到Unknown cpu type 100000c no adjustments made 当我编译arm7s时 我得
  • 命令 /Applications/Xcode-beta.app/Contents/Developer/usr/bin/atool 失败,退出代码 255

    它发生在新的 Xcode7 beta 中 CompileAssetCatalog Users admin Library Developer Xcode DerivedData InstaAd ddgdnbxlpxipirebpndfmgr
  • 循环多个 UIAlertController

    在某些情况下 我的应用程序需要显示多个警报消息 错误消息在启动时收集 并且需要一次向用户显示一条 当第一个被确认后 应该呈现下一个 问题在于 显然 它们都试图同时执行 有没有一种聪明的方法可以同步执行此操作 这是一些简单描述我想要做的事情的
  • cameraOverlayView 防止使用 allowedEditing 进行编辑

    在我的应用程序中 使用以下行在拍摄照片后对其进行编辑 移动和缩放 效果很好 imagePicker setAllowsEditing YES 但如果我还使用cameraOverlayView 则编辑模式将不再起作用 屏幕出现 但平移和捏合手
  • iOS Swift 和 reloadRowsAtIndexPaths 编译错误

    我与 xCode Swift 陷入僵局并刷新 UITableView 的单行 这条线有效 self tableView reloadData 而这条线没有 self tableView reloadRowsAtIndexPaths curr
  • 如何在 iOS 上固定证书的公钥

    在提高我们正在开发的 iOS 应用程序的安全性时 我们发现需要对服务器的 SSL 证书 全部或部分 进行 PIN 操作以防止中间人攻击 尽管有多种方法可以做到这一点 但当您搜索此内容时 我只找到了固定整个证书的示例 这种做法会带来一个问题
  • 子类 PFObject 上的 PFUser 属性

    我使用以下类 动态属性以及 m 文件中的 load 和 parseClassName 方法 对 PFObject 进行了子类化 interface DAOpponents PFObject
  • 检查 Swift 中关联类型是否符合协议

    在类似情况下 如何检查对象是否符合 可表示 协议 protocol Representable associatedtype RepresentType var representType RepresentType get set cla
  • 领域:结果 和列表

    是否可以转换Results
  • 下载进度条在 iOS 企业发行版中没有改变进度

    我正在通过企业分发开发和分发 iPad 应用程序 它们下载并执行良好 因此一切正常 Web 链接 ipa 文件 plist 文件 配置 问题 是 当用户单击链接进行下载时 iPad 中显示下载进度的进度条显示 正在等待 但却是空的并且永远不
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且
  • 如何观察UserDefaults的变化?

    我有一个 ObservedObject在我看来 struct HomeView View ObservedObject var station Station var body some View Text self station sta

随机推荐

  • 如果物理内存的大小是2^32-1,那么虚拟内存的大小是多少?

    我知道物理地址是 32 位长 但是如何通过这些信息找出虚拟内存的大小 虚拟内存地址空间的总大小为2 32x86架构和更大 目前约为 2 48 x64建筑学 然而 操作系统通常会保留一部分空间 因此 32 位应用程序不一定能一次寻址 4GB
  • 在 OSX 和 PHP 版本 5.5.3 中使用 MAMP 时,php 编辑不会立即显示

    更改php文件并刷新浏览器后 更改不会立即显示 而是在15秒后刷新显示更改 但是 PHP 版本 5 2 17 的更改会立即显示 但 PHP 版本 5 5 3 不会立即显示 phpinfo 报告 php 版本 5 2 17 的 HTTP 响应
  • 指定的 deps.json '$$$' 不存在

    我对 NET Core 相当陌生 我有一个 NET Core WebAPI 项目 MyWebApp 另外 我有使用 EntityFrameworkCore 的 Net Core 类库项目 MyLib 当我尝试使用添加迁移时 出现错误指定的
  • Android IAB:设备上无法使用计费服务

    我正在尝试在我的应用程序中实现 IAB 每次应用程序启动时 启动都会失败并显示 Problem setting up In app Billing IabResult Billing service unavailable on devic
  • Heroku - 将单个表转储并加载到共享 postgres 数据库

    我想知道是否有一种简单的方法可以将一个表的内容转储或加载到heroku共享数据库 postgres Heroku 推荐了 pgbackups 插件 但根据文档它支持转储和加载整个数据库 我需要的只是转储 加载单个表 您可以使用水龙头 htt
  • Mysqldb 属性错误:游标

    我开始在 python 中使用 mysqldb 模块 并且我似乎对调用查询的 标准 方式有一些问题 我知道标准方法是创建游标 然后用它来执行查询 然而 当我尝试实例化一个时 它给了我以下错误 属性错误 光标 我的数据库类如下所示 class
  • Java:通过 UserObject 字段递归搜索 TreeModel?

    我有一个使用 DefaultTreeModel 的 Jtree 每个单独的节点都包含一个包含各种字符串字段的 UserObject 我想通过递归遍历来查找并选择一个节点 直到找到 UserObject 与其字段之一匹配的 DefaultMu
  • 如何在bootstrap中使用垂直对齐

    简单的问题 如何使用 bootstrap 在一个列内垂直对齐一个列 这里的例子 我想垂直对齐child1a和child1b http bootply com 73666 http bootply com 73666 HTML div cla
  • GDB/bin/bash 无法在 Eclipse CDT 中执行应用程序?

    在 Mac OS X Mojave 上使用 Eclipse CDT 运行 GDB 时遇到困难 当我尝试调试项目时 GDB 表现得很混乱 我能够调试几次 但随后它在下一个调试会话开始时开始停止 并显示消息 配置 GDB 可执行文件是 User
  • 将数据持久保存在 Oracle 数据库的 docker 卷中

    我创建了用于存储我的应用程序数据库数据的卷 docker volume create dbvolume 然后我启动了带有 Oracle XE 11g 数据库映像和数据卷的 docker 容器 docker run name OracleXE
  • 如何在 Perl 中序列化数组引用数组?

    Perl 有很多用于序列化数据的模块 我不知道该选择哪一个 我需要将以下数据序列化为字符串 以便将其放入数据库中 my categories Education Higher Education Colleges Schooling Col
  • ng build 无法在“History”上执行“replaceState”:无法在原始“null”和 URL 的文档中创建带有 URL 的历史状态对象

    我使用的是 Google Chrome 版本 52 我希望能够通过访问 index html 在本地运行我的应用程序 而无需服务器 我能够访问我的应用程序的登陆页面 但是 当我尝试导航到另一个页面或单击任何按钮时 它无法工作 我尝试了很多方
  • Solr 4.0 中的 BaseTokenFilterFactory 去哪儿了?

    用于创建您自己的标记和字符过滤器的 Solr 文档说明如下 http wiki apache org solr AnalyzersTokenizersTokenFilters Specifying an Analyzer in the sc
  • 按 IN 值列表排序

    我在 PostgreSQL 8 3 中有一个简单的 SQL 查询 它捕获了一堆评论 我提供一个sorted的值列表IN构造在WHERE clause SELECT FROM comments WHERE comments id IN 1 3
  • Android 中的 Ping 应用程序

    我正在制作一个应用程序 它将实现 ping 命令的一些功能 问题是 我不知道在 ANDROID 中使用哪个 哪些库 有人对此有什么想法吗 我访问过这些 stackoverflow 链接 但它们并不是很有帮助 有没有办法让 Android 设
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据
  • 为什么 django 强制所有模型类都在 models.py 中?

    我刚刚了解到 将模型类拆分为不同的文件会破坏 django 的许多内置功能 我有java背景 在那里 编写很长的类文件并不被认为是一种好的做法 但是 django 对所有模型类强制执行单个文件可能会导致程序员编写很长的 models py
  • 以编程方式在 Material-UI 中打开工具提示

    我需要能够向元素添加工具提示 以便它像正常一样运行 当元素悬停时打开 同时我需要能够以编程方式打开它 我知道它有openprop 允许这样做 但在这种情况下 我会将组件从不受控制切换到受控制 这是不可能的 我也无法总结 hover工具提示内
  • 在 WPF FlowDocument 中的指定位置插入超链接

    我想以编程方式将 WPF 超链接元素插入 FlowDocument 中 目标是创建一个工具栏按钮 该按钮将获取 RichTextBox 中的一系列文本并将其替换为超链接 它与您在网络上看到的用于在 wiki 或博客 或 StackOverf
  • SwiftUI 模态视图

    从任何类或结构中模态显示 SwiftUI 视图的最佳方式是什么 我使用 UIKit 中的 UIHostingController 有没有更好的方法只使用 SwiftUI 来做到这一点 带有用于呈现 SwiftUI 视图的按钮的 Conten