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

嵌入到UIView中时SwiftUI视图不更新其状态(使用UIHostingController)

嵌入到UIView中时SwiftUI视图不更新其状态是因为在使用UIHostingController将SwiftUI视图嵌入到UIKit中时,可能会遇到状态不更新的问题。这是因为SwiftUI和UIKit的生命周期不同,导致状态更新的机制不一致。

为了解决这个问题,可以尝试以下几种方法:

  1. 使用@StateObject或@ObservedObject:在SwiftUI视图中使用@StateObject或@ObservedObject来管理数据模型。这样可以确保数据模型的状态更新能够正确地传递给嵌入的UIView。
  2. 使用Binding:在将SwiftUI视图嵌入到UIView时,可以使用Binding来传递状态。通过将状态包装在Binding中,并在UIView中使用该Binding来更新状态,可以确保状态的更新能够正确地传递回SwiftUI视图。
  3. 使用Combine框架:Combine是苹果提供的用于处理异步事件流的框架。可以使用Combine来监听状态的变化,并在状态更新时更新UIView。
  4. 使用NSNotification:可以在SwiftUI视图中发送NSNotification来通知UIView更新状态。在UIView中监听该通知,并在接收到通知时更新状态。
  5. 使用UIViewRepresentable:如果以上方法都无法解决问题,可以考虑使用UIViewRepresentable来创建一个自定义的UIView包装器。通过在UIViewRepresentable中手动管理状态的更新,可以确保状态的更新能够正确地传递给嵌入的UIView。

总结起来,解决SwiftUI视图嵌入到UIView中状态不更新的问题可以使用@StateObject或@ObservedObject、Binding、Combine框架、NSNotification或UIViewRepresentable等方法。具体选择哪种方法取决于具体的场景和需求。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云数据库MySQL版(CMYSQL):https://cloud.tencent.com/product/cmysql
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(TBaaS):https://cloud.tencent.com/product/tbaas
  • 腾讯云物联网平台(TIoT):https://cloud.tencent.com/product/tiot
  • 腾讯云移动开发平台(MPS):https://cloud.tencent.com/product/mps
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WWDC - SwiftUI - 初恋般的感觉

你可以通过Xcode新的实时反馈功能,来优化你的视图布局 。 第一节 创建一个使用SwiftUI的新Xcode项目。浏览画布、预览和SwiftUI模板代码。...你可以利用stacks嵌入多个view,它可以垂直嵌入、水平嵌入等。 在这里,我们将使用垂直stack来显示park详情信息。 ? 第一步 Command+点按text初始化方法区域。...第一步 添加一张图片asset catalog。 在Resource文件夹中找到turtlerock.png图片,然后把它拖拽asset catalog。...你可以MapKit的MKMapView类来展示渲染地图界面。 在SwiftUI使用UIView或者子类,你需要让你的view遵循UIViewRepresentable协议。...预览状态下,你可以继续编写view的代码,Live Preview会实时更新视图。 第五步 将CircleImage添加到stack上面。

3.8K10

Airbnb 的三阶段 SwiftUI 迁移实践

如上所述,第一步是基于一系列风格使用 SwiftUI 重建现有的设计系统,这些风格可以通过修饰符实例化并传给视图。这为开发人员使用几行代码轻松定制 UI 组件提供了基础。...简单地说,桥接是基于 UIHostingViewController(将 SwiftUI 层次结构嵌入视图控制器)和 UIViewRepresentable(将 UIKit 视图集成 SwiftUI...Airbnb 工程师做出的另一个决定是将 Epoxy 的单向数据流应用到 SwiftUI,将 ObservableOject 作为状态类的基础,在每次状态变化时触发 SwiftUI 重新渲染。...为此,他们为每个定义的视图变体起了一个名字,以便与他们的快照测试服务一起使用,并让所有视图变体遵循 Xcode 的 PreviewProvider 协议,以便使用 Xcode 预览。...Bodayle 解释说,与 UIKit 实现相比,现在的代码量大约减少原来的六分之一,而且没有出现与 SwiftUI 响应性相关的性能损失,除了实例化 UIHostingController 的一点开销

19410

从用SwiftUI搭建项目说起

这两张图相信看过苹果官方SwiftUI介绍文档并且跟着写了一遍代码的同学应该陌生,当然我们的目的不是说这两篇的代码,这个具体的可以下面连接去查看,我自己跟着写了一遍之后对SwiftUI也是有了一个基本的认识...标签(TabBar)+ 导航(Na)形式的模式是随处可见的,我们这次的目的是利用SwiftUI搭建这样一个场景构建一个基本的应用,包括登录和数据处理以及iOS常见控件在SwiftUI的一些具体的使用,...在UIKit我们的导航、标签都是通过控制器来管理,但是在SwiftUI他们分别是通过NavigationView+TabView管理的,我们得在认识上有一个基本的转变,从ControllerView.../p/11417123.html /* 通过使用 @State 修饰器我们可以关联出 View 的状态....SwiftUI 将会把使用过 @State 修饰器的属性存储一个特殊的内存区域,并且这个区域和 View struct 是隔离的.

4.4K20

为什么SwiftUI视图使用结构体?

在UIKit,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定放置方式的约束,用于将其内容呈现其中的图层等等。...但是,尽管性能很重要,但视图作为结构体还是有很多更重要的事情:它迫使我们考虑以一种干净的方式隔离状态。...您会发现,类能够自由更改值,这可能导致代码混乱——SwiftUI如何知道什么更改了值并需要更新UI?...通过生成不会随时间变化的视图SwiftUI鼓励我们转向更具功能性的设计方法:在将数据转换为UI,我们的视图变成简单的,惰性的东西,而不是会失去控制的智能化的东西。...当您查看可以作为视图的事物,可以看到这一点。我们已经使用了Color.red和LinearGradient作为视图——包含很少数据的简单类型。

3.1K10

为什么 SwiftUI视图使用结构体

在 UIKit ,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定放置方式的约束,用于将其内容呈现其中的图层等等。...但是,尽管性能很重要,但视图作为结构体还是有很多更重要的事情:它迫使我们考虑以一种干净的方式隔离状态。...您会发现,类能够自由更改值,这可能导致代码混乱—— SwiftUI 如何知道什么更改了值并需要更新 UI?...通过生成不会随时间变化的视图SwiftUI 鼓励我们转向更具功能性的设计方法:在将数据转换为 UI ,我们的视图变成简单的,惰性的东西,而不是会失去控制的智能化的东西。...当您查看可以作为视图的事物,可以看到这一点。我们已经使用了 Color.red 和 LinearGradient 作为视图——包含很少数据的简单类型。

2.4K50

SwiftUI使用UIKit视图

•updateUIViewSwiftUI会在应用程序的状态(State)发生变化时更新受这些变化影响的界面部分。...•处理UIKit视图中的复杂逻辑在UIKit开发,通常会将业务逻辑放置在UIViewControllerSwiftUI没有Controller这个概念,视图仅是状态的呈现。...(自定义协调器)、transaction(如何处理状态更新,动画模式)以及environment(当前视图的环境值集合)。...考虑尽量不将例程复杂化,我们使用UIColor、UIFont作为配置类型。将SwiftUI的Color和Font转换成UIKit版本将增加不小的代码量。...学会使用很容易,但想用好确实有一定的难度。在UIKit视图SwiftUI视图之间共享可变状态和复杂的交互通常相当复杂,需要我们在这两种框架之间构建各种桥接层。

8.1K20

SwiftUI TextField 进阶 —— 事件、焦点、键盘

当接受到的SubmitTriggers值包含在 onSubmit 设置的SubmitTriggers,传递将终止。...使用快捷键获得焦点 当一个视图中有多个 TextField(包括 SecureField),我们可以直接使用Tab键按顺序在 TextField 中切换焦点,但 SwiftUI 并没有直接提供使用快捷键让某个...在 SwiftUI 3.0 之前,我们必须在主视图上另外绘制或者使用SwiftUI 的方式来解决问题,在 SwiftUI 3.0 ,由于添加了原生设置键盘辅助视图(下文具体介绍)的功能,解决上述问题将不再困难...同其他类型的 Toolbar 类似,SwiftUI 会干预内容的排版。•无法对同一视图中多个 TextField 分别设定辅助视图在 ToolbarItem 无法使用稍微复杂一点的判断语法。...将键盘辅助视图集成 toolbar 的逻辑也有些令人令人费解。 通过 UIKit 创建 当前阶段,通过 UIKit 来创建键盘辅助视图仍是 SwiftUI 下的最优方案。

13.1K10

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

3) VideoPlayer 是一个方便的 SwiftUI 视图,需要播放器对象才能发挥作用。 您可以使用它来播放视频。 4) 默认情况下,SwiftUI 视图考虑设备的安全区域。...这个 CALayer 子类就像任何其他层:它显示contents属性的任何内容。 该层恰好用您通过player属性提供的视频的帧填充其内容。...AVPlayerLayer } 为了能够在 SwiftUI使用视图,您需要使用 UIViewRepresentable 创建一个包装器。...2) 您使用初始值设定项创建 LoopingPlayerUIView 的新实例并返回新实例。 3) SwiftUI 在需要更新底层 UIView 时会调用此方法。 现在,将其留空。...2) 当有人双击播放器视图,您可以添加一个侦听器。 这会在 2x 和 1x的播放速率之间切换。 3) 当有人单击播放器视图,您可以添加一个侦听器。 这会切换视频的静音状态

6.9K10

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

如果你不想让父视图也被更新,可以在创建对象使用 @StateObject 或 @ObservedObject 。...这可能会导致一些不好的后果,例如使视图的可重用性降低,并将业务逻辑与 SwiftUI 视图的生命周期挂钩,这将使处理业务逻辑变得更加困难。简而言之,我们建议使用视图作为视图模型。...A:当在其他类型的 UIViewControllers 中使用 UIHostingController ,你可能会通过调用托管控制器的方法来触发视图加载提前发生。...事实上,这些视图( 惰性容器视图 )一旦被创建,存续期将持续惰性容器被销毁为止。请阅读 SwiftUI 视图的生命周期研究[12] 了解更多内容。...但是从一个文本字段下一个文本字段的聚焦感觉不够流畅,而且每当我在一个文本字段输入一个字母,我的 CPU 使用率似乎会飙升到 70% — 100%。

12.2K20

SwiftUI 中用 Text 实现图文混排

当我们想在 Text 中进行图文混排,需要采用与视图布局不同的思路与操作方式。...一个和一组在 SwiftUI ,Text 是使用频率最高的几个组件之一,几乎所有的文字显示操作均由完成。随着 SwiftUI 版本的不断提升,Text 的功能也得到持续地增强。...在 SwiftUI ,我们需要通过 Image 来显示 SF Symbols,并可使用一些修饰器来对进行设置:Image(systemName: "ladybug") .symbolRenderingMode...image-20220814181138809遗憾的是,由于 frame 会更改 Image 的类型,因此我们无法将通过 frame 动态更改尺寸后的图片嵌入 Text ,以实现可动态调整尺寸的图文混排...SwiftUI 4 提供的 ImageRenderer 完成视图至图片的转换,因此仅支持 iOS 16+在低版本的 SwiftUI ,可以通过用 UIHostingController 包裹视图的方式

4.2K30

SwiftUI-数据流

数据处理的基本原则 Data Access as a Dependency:在 SwiftUI 数据一旦被使用就会成为视图的依赖,也就是说当数据发生变化了,视图展示也会跟随变化,不会像 MVC 模式下那样要不停的同步数据和视图之间的状态变化...开发者不需要关心数据和视图状态同步工作,只需要关心数据的获取以及逻辑处理,使用起来非常简单,大大提高了开发效率。...@Binding 主要有两个作用: 在持有数据源的情况下,任意读取。 从 @State 获取数据应用,并保持同步。...数据流图 从上图可以看出SwiftUI 的数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态的改变 数据状态的变化会触发视图重绘 SwiftUI 内部按需更新视图,...最终再次呈现给用户,等待下次界面操作 注意 在 SwiftUI ,开发者只需要构建一个视图可依赖的数据源,保持数据的单向有序流转即可,其他数据和视图状态同步问题 SwiftUI 帮你管理,所以 ViewController

10K20

SwiftUI 状态管理系统指南

前言 SwiftUI与苹果之前的UI框架的区别不仅仅在于如何定义视图和其他UI组件,还在于如何在整个使用它的应用程序管理视图层级的状态。...属性状态 由于SwiftUI主要是一个UI框架(尽管它也开始获得用于定义更高层次结构(如应用程序和场景)的API),声明式设计不一定需要影响应用程序的整个模型和数据层——而只是直接绑定到我们各种视图状态...视图的内部状态,并在该状态被改变自动使视图更新。...StateObject——我仍然建议在观察外部对象使用ObservedObject,而在处理视图本身拥有的对象使用StateObject。...小结 SwiftUI管理状态的方式绝对是该框架最有趣的方面之一,它可能需要我们稍微重新思考数据在应用的传递方式——至少在涉及将被我们的UI直接消费和修改的数据是这样。

5K20

掌握 Transaction,实现 SwiftUI 动画的精准控制

同时,在 SwiftUI 的动画系统,有关 Transaction 的解释很少,无论是官方资料还是第三方文章,都没有对运作机制进行系统的阐述。...与环境值有些类似,SwiftUI 会在视图层次结构隐式向下传播 transaction。...使用显式动画屏蔽系统组件动画 在 iOS 17 SwiftUI 会让大多数系统组件(如 Sheet、FullScreeCover、NavigationStack、Inspector 等)在实现动画...例如,对于 FetchRequest,我们可以通过三种方式来控制在数据增加或删除是否采用动画效果。...在使用“显式动画”,通过在局部声明“隐式动画”来避免部分视图出现动画异常。 在需要的情况下,可以通过 TransactionKey 提供更丰富的上下文信息 尽量不在一次状态改变修改过多的属性。

43720

如何在SwiftUI实现interactiveDismissDisabled

需求 由于健康笔记[2]数据录入都是在Sheet中进行的,为了防止用户在录入过程由于误操作(使用手势取消Sheet)丢失数据,因此,从最初的版本开始,我就一直使用各种手段加强对Sheet的控制。...目标为: •通过代码控制是否允许手势取消Sheet•在用户使用手势取消Sheet可以获得通知,进而拥有更多的控制能力 最终实现的效果如下: dismissSheet 当用户有未保存的数据,通过手势取消...当用户使用手势取消Sheet,系统将首先执行presentationControllerWillDismiss,然后再从presentationControllerShouldDismiss获取是否允许取消...在之前的版本[8],用户使用手势取消的通知和其他的逻辑是分离的,在使用不仅繁琐,而且影响代码的观感。本次将一并解决这个问题。...delegate = delegate } }} makeUIView只需要创建一个空视图UIView),由于在执行makeUIView,无法保证Sheet视图已经被正常展示

3.8K40

声明式 UIKit 在有赞美业的实践

方便的布局方式,通过布局来接管视图的大小和位置,使得各个视图节点得到了很好的解耦,大大地提高了 UI 代码的可移植性。...由于提供的是约束,强调视图“之间”的相互关系,意味着关系一旦定下来,修改约束(包括添加和移除视图),必定会影响另一个视图的引用,从而导致代码移植性不高。...SwiftUI 由于 iOS 13 的限制,以及生态的不完善,也还没达到我们在项目中能直接上手使用的程度,前期版本的迭代也会因为不稳定等因素可能会出现 API 的大改。...一眼就能看出 UI 结构。 UIView |-- UILabel |-- UIButton 同时 View 之间没有相互联系,移植性高。...对于我们来说成本极高的,而我们的目的是使用布局和声明式来提高开发效率。

1.4K30

大前端开发的“树” (下)

类比到 Web 就是前文提到的 Virtual DOM,在 Android Composed 和 iOS 的 SwiftUI 也有相似的概念。...5.2.2 视图更新 Flutter 中视图更新有三个类型分别是 build、layout、paint。这三种类型都遵循一个统一的流程,下面用更新流程图展示。...build 流程 某一个节点需要刷新,会将自己添加到一个单例对象 Owner 的 dirty 列表,表示自己需要更新。...更进一步,上层业务代码可以在 Widget 声明 “有状态” 和 “无状态” 来显式控制更新。...“来自 React 框架的设计灵感” [5] 同时,在 Apple 的 SwiftUI 和 Google 的 Jetpack Compose 这两个新一代视图方案,同样引入了视图状态的概念和局部视图更新能力

1.9K30
领券