首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何以编程方式从SwiftUI导航堆栈中弹出UIViewControllerRepresentable

SwiftUI是苹果公司推出的一种用于构建用户界面的声明式框架,而UIViewControllerRepresentable是SwiftUI中的一个协议,用于将UIKit中的UIViewController嵌入到SwiftUI的视图层次结构中。

要以编程方式从SwiftUI导航堆栈中弹出UIViewControllerRepresentable,可以使用以下步骤:

  1. 首先,确保你的UIViewControllerRepresentable已经添加到了导航堆栈中。你可以使用SwiftUI的NavigationView来管理导航堆栈。
  2. 在需要弹出UIViewControllerRepresentable的地方,使用SwiftUI的导航链接(NavigationLink)或按钮(Button)等视图控件来触发弹出操作。
  3. 在触发操作的回调中,使用SwiftUI的导航链接(NavigationLink)的isActive属性或SwiftUI的环境变量(@Environment)来控制导航堆栈中的视图是否显示。
  4. 当需要弹出UIViewControllerRepresentable时,将isActive属性或环境变量设置为false,这将导致导航堆栈中的视图被弹出。

以下是一个示例代码,展示了如何以编程方式从SwiftUI导航堆栈中弹出UIViewControllerRepresentable:

代码语言:txt
复制
import SwiftUI

struct ContentView: View {
    @State private var isPresented = false
    
    var body: some View {
        NavigationView {
            VStack {
                Button("弹出视图") {
                    isPresented = true
                }
            }
            .navigationTitle("主视图")
            .sheet(isPresented: $isPresented) {
                PresentedViewControllerRepresentable(isPresented: $isPresented)
            }
        }
    }
}

struct PresentedViewControllerRepresentable: UIViewControllerRepresentable {
    @Binding var isPresented: Bool
    
    func makeUIViewController(context: Context) -> UIViewController {
        let viewController = PresentedViewController()
        viewController.delegate = context.coordinator
        return viewController
    }
    
    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
        // 更新视图控制器
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, PresentedViewControllerDelegate {
        let parent: PresentedViewControllerRepresentable
        
        init(_ parent: PresentedViewControllerRepresentable) {
            self.parent = parent
        }
        
        // 实现弹出视图控制器的代理方法
        func dismiss() {
            parent.isPresented = false
        }
    }
}

protocol PresentedViewControllerDelegate: AnyObject {
    func dismiss()
}

class PresentedViewController: UIViewController {
    weak var delegate: PresentedViewControllerDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let closeButton = UIButton(type: .system)
        closeButton.setTitle("关闭", for: .normal)
        closeButton.addTarget(self, action: #selector(closeButtonTapped), for: .touchUpInside)
        closeButton.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(closeButton)
        
        NSLayoutConstraint.activate([
            closeButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            closeButton.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
    
    @objc func closeButtonTapped() {
        delegate?.dismiss()
    }
}

在上面的示例代码中,ContentView是主视图,其中包含一个按钮,点击按钮将弹出一个自定义的UIViewControllerRepresentable(PresentedViewControllerRepresentable)。PresentedViewControllerRepresentable将一个自定义的UIViewController(PresentedViewController)嵌入到SwiftUI的视图层次结构中。

当点击按钮时,isPresented属性将被设置为true,从而触发弹出操作。PresentedViewControllerRepresentable中的makeUIViewController方法将创建并返回一个PresentedViewController实例,并将其委托给一个协调器(Coordinator)对象。协调器实现了弹出视图控制器的代理方法,当点击PresentedViewController中的关闭按钮时,将调用代理方法来关闭弹出的视图。

通过这种方式,我们可以以编程方式从SwiftUI导航堆栈中弹出UIViewControllerRepresentable。请注意,这只是一个示例,你可以根据自己的需求进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SwiftUI 4.0 的全新导航系统

SwiftUI 4.0( iOS 16+ 、macOS 13+ )对导航系统作出了重大改变,提供了以视图堆栈为管理对象的新 API ,让开发者可以轻松实现编程导航。本文将对新的导航系统作以介绍。...使用新的编程式 API ,开发者可以轻松地实现例如:返回根视图、在当前视图堆栈添加任意视图( 视图跳转 )、视图外跳转( Deep Link )等功能。...基于类型的响应式目标视图处理机制 比如下面的代码是在老版本( 4.0 之前 )SwiftUI 中使用编程式跳转的一种方式: struct NavigationViewDemo: View { @...⚠️ 在使用堆栈管理系统的情况下,请不要在编程导航混用声明式导航,这样会破坏当前的视图堆栈数据 下面的代码,如果点击声明式导航,将导致堆栈数据重置。...相当一部分开发者由于版本适配的原因并不会使用新的 API ,因此,每个人都需要认真考虑如下问题: 如何从新 API 获得灵感 如何在老版本运用编程导航思想 如何让新老版本的程序都能享受系统提供的便利

10.3K62

onAppear 的调用时机

本文将通过 SwiftUI 4 提供的新 API ,证明 onAppear 的调用时机是在布局之后、渲染之前。 问题 同之前多篇博客类似,我们还是 聊天室 的一个 问题开始。...创建实例、求值、布局、渲染 在 SwiftUI ,一个视图在它的生命周期中通常会经历四个阶段: 创建实例 视图树,处于可显示分支的视图基本上都会经历的一个阶段。...当视图的依赖( Source of truth )发生变化后,SwiftUI 会重新计算视图结果值,并与旧值进行比较。发生变化,则用新值替换旧值。...判断视图正准备渲染 尽管 SwiftUI 视图并没有提供可以展示该过程的 API,不过我们可以利用 UIViewControllerRepresentable 协议来包装一个 UIViewController...通过 UIViewControllerRepresentable 封装的“视图”并非真正的视图,对于 SwiftUI 来说,它就是一块给出了需求尺寸的黑洞,因此并不存在求值一说。

1.1K10
  • onAppear 的调用时机

    本文将通过 SwiftUI 4 提供的新 API ,证明 onAppear 的调用时机是在布局之后、渲染之前。问题同之前多篇博客类似,我们还是 聊天室 的一个 问题 开始。...创建实例、求值、布局、渲染在 SwiftUI ,一个视图在它的生命周期中通常会经历四个阶段:创建实例视图树,处于可显示分支的视图基本上都会经历的一个阶段。...当视图的依赖( Source of truth )发生变化后,SwiftUI 会重新计算视图结果值,并与旧值进行比较。发生变化,则用新值替换旧值。...判断视图正准备渲染尽管 SwiftUI 视图并没有提供可以展示该过程的 API,不过我们可以利用 UIViewControllerRepresentable 协议来包装一个 UIViewController...通过 UIViewControllerRepresentable 封装的“视图”并非真正的视图,对于 SwiftUI 来说,它就是一块给出了需求尺寸的黑洞,因此并不存在求值一说。

    2.1K20

    Core Data with CloudKit (六) —— 共享数据

    包括其关系数据)私有数据库的com.apple.coredata.cloudkit.zone移动到新建的Zone。...在SwiftUI下,用于尚未生成CKShare情况的构造方法在使用UIViewControllerRepresentable包装时异常,因此,推荐在SwiftUI下首先使用代码(share)手动为托管对象生成...我在Demo也展示了另一种不通过UIViewControllerRepresentable调用UICloudSharingController的方式。...另外,Demo还有一个直接调用UICloudSharingController的方式(已被注释掉),这种方式的用户体验更好,不过手段不是很SwiftUI化。...2.共享时,设置成任何人可接收,尽量不要直接在UICloudSharingController通过信息、邮件等方式发送到另一个有效的iCloud账户上,否则大概率无法打开该共享链接,会显示共享已取消

    1.4K20

    解析 SwiftUI 两处由状态更新滞后引发的严重 Bug

    本文将解析 SwiftUI 两个由于未能贯彻响应式编程原则而导致的严重错误,并提供相应的解决方案。...原文发表在我的博客 肘子的Swift记事本视图变化在前、状态变化在后在 SwiftUI ,某些可编程控件在执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死这是一个在 SwiftUI 所有版本存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...如果我们认为问题出在这里,就需要使用编程导航方式来调整代码。为了不影响用户的使用习惯,我们禁用了 NavigationStack 自带的 Back 按钮。...幸运的是,我 @KyleSwifter 的 解密 SwiftUI 背后的 AttributeGraph 一文中找到了线索。

    707110

    解析 SwiftUI 两处由状态更新滞后引发的严重 Bug

    本文将解析 SwiftUI 两个由于未能贯彻响应式编程原则而导致的严重错误,并提供相应的解决方案。...视图变化在前、状态变化在后 在 SwiftUI ,某些可编程控件在执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。这些控件基本上都是对 UIkit(AppKit)的二次包装。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死 这是一个在 SwiftUI 所有版本存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...如果我们认为问题出在这里,就需要使用编程导航方式来调整代码。 为了不影响用户的使用习惯,我们禁用了 NavigationStack 自带的 Back 按钮。...幸运的是,我 @KyleSwifter[4] 的 解密 SwiftUI 背后的 AttributeGraph[5] 一文中找到了线索。

    34620

    AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

    您将看到的第一个是当前位于手机存储的类型。 稍后,您将学习如何服务器播放视频流。...首先,导航到 VideoFeedView.swift 并在 SwiftUI 导入的正下方添加以下导入: import AVKit 看看下面这个,你会看到你已经有了一个列表和一个视频数组。...这就是应用程序如何用数据填充现有列表的方式。 视频本身来自嵌入在应用程序包的 JSON 文件。 如果您好奇,您可以查看 Video.swift 以了解它们是如何获取的。...看起来您必须以手动方式做事。 您需要做的就是跟踪您的播放器和当前播放的项目。 当它到达最后一个视频时,您将再次将所有剪辑添加到队列。...2) 您定义了一个符合 UIViewControllerRepresentable 的结构,以便能够在 SwiftUI 中使用 AVPlayerViewController。

    7K10

    Ask Apple 2022 与 SwiftUI 有关的问答(上)

    是否有任何建议用来检测列表的行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或列表中选择一个选项 )?...只有将这些变量重构到视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构或许是好的选择。...在我的例子,不拖动时 0 到 75,拖动时 0 到 100。有什么办法可以阻止这种情况吗?A:你可以用 .chartYScale(domain: 0 ... 75) 锁定 Y 轴的刻度域。...通用导航模型Q:我们正在使用带有路径参数的 NavigationStack,但当用户在 stage manager 把窗口的大小 Regular 调整为 Compact 时,我们在 “转换” 路径方面遇到了麻烦...在常规宽度下,我们在详细视图中有一个带有导航堆栈的侧边栏。在紧凑宽度下,我们有一个标签栏,每个标签都有一个导航堆栈

    12.3K20

    SwiftUI:使用 @EnvironmentObject 环境读取自定义值

    如果我们使用@ObservedObject,则需要将我们的对象每个视图传递到下一个视图,直到它最终到达可以使用该视图的视图E,这很烦人,因为B,C和D不在乎它。...使用@EnvironmentObject,视图A可以将对象放入环境,视图E可以环境读取对象,而视图B,C和D不必知道发生了什么。...这意味着,如果视图A是导航视图,则所有压入导航堆栈的视图都可以访问同一环境。但是,如果视图A以工作表(sheet)的形式显示视图B,则它们不会自动共享环境数据,因此我们需要手动发送。...首先,这是我们可以使用的一些基本数据: class User: ObservableObject { @Published var name = "Taylor Swift" } 您所见,使用...当然,我们可以在单个视图中表示出来,但是通过这种方式,您可以确切地看到使用环境对象时通信的无缝性。 现在,这是最聪明的部分。

    9.7K20

    Xcode 11 初体验

    将 Assistant、和 Vesion Editor下的Autor 选项卡合并为一项,并从主导航移除,向下移到每个编辑面板,组成 Editor Option。...主导航只保留Code Review功能。 新增Add Editor、MiniMap。 我们这里着重介绍一下 Editor Options 、Add Editor、MiniMap 这3个选项。...指定文件打开位置 上面我们介绍了窗口分割,在 Xcode 11 ,你还可以按住 Option + Shift,然后在左边点击要打开的文件,这时会出现窗口选择提示 你可以用键盘,或者鼠标任意方式选择你要打开这个文件的窗口...看来苹果爸爸也实在受不了我们乱七八糟没有注释的代码,提倡我们文明编程 Change Bar Change Bar这个功能之前也有,我还是比较喜欢的!...SceneDelegate 更新 Apple 建议我们把视图层级相关的方法 didFinishLanchingWithOptions 迁移到 SceneDelegate 的 willConnectTo

    3.2K10

    SwiftUI 创建自适应的程序化导航方案

    4.0 版本开始,苹果对之前 SwiftUI 有限的程序化导航能力进行了大幅度的增强,通过引入 NavigationStack 和 NavigationSplitView,开发者基本上具备了全程掌握应用的导航状态的能力...与 UIKit 使用的命令式导航方式不同,SwiftUI 作为一个声明式框架,感知与设置两者之间是二位一体的关系。读取状态即可获知当前的导航位置,更改状态便可调整导航路径。...因此在 SwiftUI ,掌握两种导航容器的状态表述差异是实现自适应导航方案的关键。...在栈推送和弹出数据的过程对应了导航容器添加和移除视图的操作。弹出全部数据相当于返回根视图,推送多个数据相当于一次性添加多个视图并直接跳转到最后数据所代表的视图。...俗话说,有得必有失,暂时这种方式只能支持两列,尚未找到可以在中间列中继续使用程序化导航方式

    4.3K30

    掌握 SwiftUI 的 Safe Area

    掌握 SwiftUI 的 Safe Area 访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验 Safe Area(安全区域)是指不与导航栏、标签栏、工具栏或其他视图控制器提供的视图重叠的内容空间...在 UIKit ,开发者需要利用 safeAreaInsets 或 safeAreaLayoutGuide ,才能确保将视图放置在界面的可见部分。 SwiftUI 对上述过程进行了彻底的简化。...SwiftUI 同时提供了一些方法和工具让开发者对安全区域有所控制。 本文将探讨如何在 SwiftUI 获取 SafeAreaInsets、将视图绘制到安全区域之外、修改视图的安全区域等内容。...KeyWindow 获取 如果只需要获取根视图的 safeAreaInsets ,我们也可以使用更加直接的方式。... iOS 14 开始,SwiftUI 计算视图的安全区域时,将软键盘在屏幕上的覆盖区域(iPadOS 下,将软键盘缩小后键盘的覆盖区域将被忽略)也一并进行考虑。

    7.7K31

    SwiftUI中使用UIKit视图

    SwiftUI中使用UIKit视图 想获得更好的阅读体验可以访问我的博客www.fatbobman.com,或点击下方的阅读原文 已迈入第三个年头的SwiftUI相较诞生初始已经提供了更多的原生功能...在相当长的时间中开发者仍需在SwiftUI依赖UIKit(AppKit)代码。好在,SwiftUI为开发者提供了便捷的方式将UIKit(AppKit)视图(或控制器)包装成SwiftUI视图。...如果你已经对如何使用UIViewRepresentable有所掌握,可以直接SwiftUI风格化部分阅读 基础 在具体演示包装代码之前,我们先介绍一些与在SwiftUI中使用UIKit视图有关的基础知识...Text只有在针对本身的foregroundColor没有设置的时候,才会尝试当前环境获取foregroundColor(针对View)的设定。...苹果对SwiftUI的野心非常大,不仅为开发者带来了声明+响应式的编程体验,同时苹果对SwiftUI在跨设备、跨平台上(苹果生态)也做出了巨大的投入了。

    8.2K22

    肘子的 Swift 周报 #033|改善社区活跃度,仅更新论坛还不够

    在论坛的新版本,苹果工程师的身份通过统一的标识( 头像上的苹果标志 ) ,替代了之前通过签名来表明身份的方式。...在这篇文章,我将梳理首个版本起那些给我留下深刻印象的 SwiftUI 关键更新及其影响。这不仅是对 SwiftUI 诞生到逐渐成熟过程的回顾,也是一次对它所蕴含活力的新的认识。...Antoine van der Lee[13] 由于 SwiftUI 的声明式编程范式和数据流管理方式与传统的 MVVM 实现有所不同,使得许多开发者对于 MVVM 是否适用于 SwiftUI 感到疑惑...在这篇文章,Antoine van der Lee 探讨了如何以适合 SwiftUI方式实施 MVVM 架构模式来构建视图。...他指出,对于那些熟练的 UIKit 开发者来说,摒弃长期形成的编程习惯和思维方式以完全适应 SwiftUI 的声明式和响应式编程模型,可能比新手更为困难。

    13410

    可视化编程,自动化减少20%代码量

    SwiftUI通过4种方式,解决了上述问题: 用一个新的声明式UI结构,定义了的布局的外观和工作方式 更新UI预览会自动生成新的Swift代码,反之,更改Swift代码也会更新UI预览 Swift的任何绑定例如有效的...让Xcode for iPad更上一层楼 开发者对Interface Builder的抱怨不是一天两天了,它大大增加了分解视图块以及视图控制器(view controller)使用视图的工作量,导致出现体积臃肿的视图控制器...而拥有更简单,更快速,更安全的SwiftUI为开发人员实现真正的平台独立性迈出了一大步。 人人都能编程 SwiftUI继承了Swift的理念:每个人都可以编程。...创建列表和导航栏: ? 处理用户输入: ? Drawing and Animation 绘图路径和形状: ? 动画视图和过渡 ? App Design and Layout 复杂界面组合: ?...比如,它只支持Swift,你不能在Obj-C里使用SwiftUISwiftUI目前还不是很成熟,正在从事iOS开发的程序员可能更应该继续使用Obj-C,直到SwiftUI足够成熟。

    5.4K20

    《深入浅出Dart》Flutter路由管理

    路由管理是构建应用程序导航和页面跳转的关键部分,它可以帮助我们实现复杂的导航结构和页面切换效果。让我们详细了解Flutter的路由管理和一些常用的组件。 1....它允许我们在应用程序执行页面的推入(push)和弹出(pop)操作。通过Navigator,我们可以将页面推入到导航堆栈,使其成为当前活动页面,也可以导航堆栈弹出页面。...) => NewPage()), ); // 弹出当前页面 Navigator.pop(context); 你可以通过Navigator的不同方法来控制页面的导航行为,push、pop、pushReplacement...命名路由 命名路由是一种更高级的路由管理方式,它通过给每个页面指定唯一的名称来进行导航。通过使用命名路由,我们可以在应用程序定义和管理所有的路由映射,使导航更加清晰和可维护。...我们定义了一个自定义的过渡动画,使用FadeTransition将页面的透明度0到1进行淡入过渡。

    27220

    ViewBuilder 研究(下) —— 模仿中学习

    : 界面设计 开发者通过声明的方式对用户界面进行轻量级描述。...SwiftUI 会在恰当的时机开发者创建的视图 body 属性读取这些描述并进行绘制。 依赖 我们常说,视图是状态的函数。对于单个视图来说,它的状态是由所有与之相关的依赖共同组成的。...SwiftUI 如何处理视图 SwiftUI 加载视图、响应状态到屏幕绘制大概经历如下过程: 根视图开始按视图层级结构沿特定分支(依据初始状态)逐个实例化视图,直到满足当前全部的显示所需 上述实例化后的视图值...我们可以通过如下的方式SwiftUI 验证上述代码: 在 SwiftUI 环境添加如下代码 public extension ViewBuilder { static func buildOptional...它们的实现要比通用 modifier 简单的多,但同在 SwiftUI 中使用 UIKit 视图[11] 一文中介绍的方式略有不同。

    3K20

    Apriso开发葵花宝典之八Portal Session篇

    页面导航 在DELMIA Apriso,页面由一个布局和几个视图组成。视图链接到页面Screen上的布局面板或通过操作作为弹出窗口。...,导航方式通过页面Screen导航类型来定义: 主页Home:堆栈的第一个屏幕,用于重置整个屏幕堆栈历史 子门户Sub Portal:用于创建新的较低级别屏幕堆栈会话, 标准Normal:将所有相关变量放入屏幕堆栈...页面堆栈Screen Stack: 每个门户会话调用一个相关联的Screen堆栈。在屏幕之间导航时,可以将屏幕推入堆栈堆栈拉出并呈现给用户。...当导航到普通屏幕时,屏幕被放置在屏幕堆栈,可以稍后返回。但是,您可以使用导航类型更改屏幕与屏幕堆栈交互的方式。... 一个视图操作可以返回以下操作: STATUS_TO_NEW STATUS_TO_CANCEL STATUS_TO_OPEN CLOSE 在这个例子,如果所有的“STATUS_TO…”动作都应该以同样的方式处理

    18010
    领券