多级子级上的 SwiftUI 更改已发布对象更改

2023-12-21

我有一个 ObservedObject AppStatus 类,它内部有多个 Published 类。如果我只在孩子方面有水平,一切都会很好。

当我有一个 RecordingTimeManager 类,其中有另一个变量(2 级子级)时,问题就出现了。当我按下按钮时,变量 maxRecordingTime 正在正确更改,它会打印“15 15Seconds”,但 foregroundColor 不会触发更改。我不确定这是否是 SwiftUI 错误,或者我应该以另一种方式构建关系:

// 应用程序状态

// Recording
@Published var recordingTimeManager: RecordingTimeManager = RecordingTimeManager()

// 录音时间管理器

class RecordingTimeManager {
    @Published var maxRecordingTime: TimeSeletedTime = .sixteenSeconds
...

// 需要根据 maxRecordingTime 更改更改不透明度的 SwiftUI 组件(.foregroundColor 未更改)

Button {
    appStatus.recordingTimeManager.maxRecordingTime = .fifteenSeconds
    print("15 \(appStatus.recordingTimeManager.maxRecordingTime)")
} label: {
    Text("15")
        .font(Font.custom("BwGradual-Bold", size: 15))
        .foregroundColor(appStatus.recordingTimeManager.maxRecordingTime == .fifteenSeconds ? CLAPSOFFWHITE : TRIBESGREY)
}

非常感谢,


可观察对象不仅仅在具有多个级别的类时才起作用。这@Published属性包装器在属性发生更改时通知视图,但因为该属性是class- 引用类型 - 当您更改其属性之一时,它实际上不会更改。换句话说,引用保持不变。

还有内在@Published不做任何事情,因为没有任何东西直接观察它(即使RecordingTimeManager符合ObservableObject)

所以,你要么需要做RecordingTimeManager值类型 - astruct:

struct RecordingTimeManager {
   var maxRecordingTime: TimeSeletedTime = .sixteenSeconds
}

或者,如果它必须是class(也许因为它有一些内部状态和生命周期),那么您可以创建一个直接观察它的内部视图。

首先,它需要是一个ObservableObject:

class RecordingTimeManager: ObservableObject {
    @Published var maxRecordingTime: TimeSeletedTime = .sixteenSeconds

然后创建一个观察它的视图(可以是私有内部视图):

struct MainView: View {
   @StateObject var appStatus: AppStatus = .init()

   private struct InnerView: View {
      @ObservedObject var recordingManager: RecordingTimeManager

      var body: some View {
         Button {
           recordingManager.maxRecordingTime = .fifteenSeconds
         } label: {
           Text("15")
             .font(Font.custom("BwGradual-Bold", size: 15))
             .foregroundColor(
                 recordingManager.maxRecordingTime == .fifteenSeconds 
                    ? CLAPSOFFWHITE : TRIBESGREY)
         }
      }
   }

   var body: some View {

      InnerView(recordingManager: appStatus.recordingTimeManager)
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多级子级上的 SwiftUI 更改已发布对象更改 的相关文章

  • 如何显示启动图像

    我是 iOS 新手 我的 Xcode 版本是 7 2 1 我尝试使用 Swift 在 iOS9 上运行 我的问题是我对如何创建启动屏幕图像感到非常困惑 我发现有很多方法可以为不同版本的 iOS 创建启动屏幕图像 有人可以向我解释一下如何设置
  • 为什么数组不符合 Equatable,而它的项在 Swift 中是 Equatable?

    UPDATE 从 Xcode 9 3 开始 包括斯威夫特 4 1 数组相等按预期工作 并且原始问题中的代码编译没有错误 然而 请查看已接受的答案 因为它提供了更好 更现代的解决方案 原问题如下 当我尝试声明类型为泛型枚举的实例时 Post
  • 在 wkwebview 中启用摄像头和麦克风访问

    我有一个针对移动设备优化的网络应用程序 它利用getUserMedia访问网络摄像头和麦克风资源 我正在将这个应用程序包装在WKWebView因为我想提供原生应用程序体验 我知道 iOS 不允许通过浏览器访问相机 但是有什么方法可以使用本机
  • 变量 p 在初始化之前通过引用传递

    我有一个 Human 类 它的函数可以接受任意数量的人 并确定某人是否比这些人中的任何人年长 然后返回一个包含他 她比其年长的人的数组 func isOlderThan people Human gt Human var p Human f
  • CoreBluetooth 功能无法从 Singleton 运行

    所以我目前在 iPad 和 iPhone 之间建立了蓝牙连接 我已经在中创建了我的测试代码ViewController一切正常 现在我把它移到了 2 个经理类 第一个是CBCentralManager和一个用于CBPeripheralMan
  • Xcode 6.3 和 Swift:Unicode 实用程序(例如 UCKeyTranslate)不可用?

    我有以下测试代码 import Cocoa import Carbon let x kUCKeyActionDisplay 在 Xcode 6 2 中没有问题 但在 Xcode 6 3 中此代码会引发错误 错误信息是 Use of unre
  • 何时使用 takeUnretainedValue() 或 takeRetainedValue() 来检索 Swift 中的非托管对象?

    根据将 Swift 与 Cocoa 和 Objective C 结合使用 https developer apple com library prerelease ios documentation Swift Conceptual Bui
  • 在 UIScrollView Swift 中禁用垂直滚动

    不要将此问题标记为重复 我读了很多问题 但没有找到问题的答案 我的问题如下 我有一个UIScrollView它应该只水平滚动 这里它垂直滚动 20px 奇怪的事实 它似乎与状态栏的高度相同 我尝试打印内容大小 y 偏移量和高度UIScrol
  • SwiftUI NavigationView 从其内部开始

    因此 我在页面视图样式的 TabView 中嵌入了一个 NavigationView 首次加载时 NavigationView 将在其内部启动 然后重新加载后即可正常显示 我不确定是什么原因造成的 我制作了一个 GIF 来更好地说明问题 这
  • 如何在 Swift 中的标签上制作阴影效果?

    我不知道如何在标签上编写阴影代码 我有一个会改变的乐谱标签 因此无法仅对带有阴影的文本进行Photoshop处理 我需要对其进行编码 以便它始终自动在文本后面有一个模糊的阴影 有人可以举一些例子或提供帮助吗 人们说这是重复的 重复 是关于
  • 在 SwiftUI 中,如何在 UIView 内部或作为 UIView 使用 UIHostingController?

    另一个问题标题可以是 如何将 UIHostingController 的视图添加为 UIView 的子视图 我正在创建一个新的 UI 组件 并且很乐意尝试 SwiftUI 下图是当前的视图结构 UIView 是我现在正在使用的 右上 Swi
  • 如何在 Swift 中生成随机数?

    我意识到 Swift 书提供了随机数生成器的实现 最佳实践是复制并粘贴此实现吗 或者有一个库可以做到这一点 我们现在可以使用吗 斯威夫特 4 2 Xcode 10 附带的 Swift 4 2 为许多数据类型引入了新的易于使用的随机函数 您只
  • 一个 AVPlayerItem 一次只能在玩家队列中占据一个位置?

    我见过许多问题 https stackoverflow com questions 6605771 an avplayeritem can occupy only one position in a players queue at a t
  • 关闭模态视图控制器时如何保持呈现视图控制器的方向?

    我正在开发这个应用程序 我需要所有视图控制器 但只有一个是纵向的 单一视图控制器很特别 我需要它能够旋转到手机所在的任何方向 为此 我以模态方式呈现它 未嵌入导航控制器中 所以 例如 我的结构是这样的 window Portrait roo
  • Xcode 6 无法在 Swift 中自动完成

    我正在尝试导入各种库 但我不记得它们的确切名称 很遗憾Xcode6 使用swift 不会像中那样自动完成它们Xcode5 使用objective c 例如 ALAssetsLibrary MPMediaPlayer etc 我被迫用谷歌搜索
  • UIWindow.makeKeyAndVisible() 在 XCTest 中抛出“props 必须具有有效的 clientID”错误

    我正在 Xcode 中使用 XCTest 测试 UIViewController 为了测试一些导航和警报功能 我需要将视图控制器放在 UIWindow 中 我使用以下代码执行此操作 let myViewController UIViewCo
  • 在 Swift 中在地图上显示路线

    我试图在苹果地图上绘制两点之间的路线 Swift 代码 下面的结构体用于存储坐标 struct GeoLocation var latitude Double var longitude Double func distanceBetwee
  • 如何根据 UITableViewCell 中的内容调整 UICollectionView 的水平高度

    我正在尝试放置一个UICollectionView in a UITableViewCell 我想在中显示评论UICollectionViewCells 与分页 注释中可能不止一行 所以我想调整大小UICollectionView如果注释标
  • 三元运算符结合性

    我无法理解三元运算符上下文中的结合性概念 在大多数情况下 三元运算符如下所示 a b c 在这种情况下 不需要结合性来计算表达式 但有时 三元运算符是嵌套的 a b c d e a b c d e is right associative
  • 从字符串初始化单元

    我正在寻找一个Unit symbol String 一种初始化程序认出 不定义符号 这是一个代码片段 通过提供来说明我的问题有限解 to it 尽管下面的解决方案有效 但明确列出了基础框架如果 Apple 在即将推出的 iOS 更新中发布新

随机推荐

  • 如何将列数据转入不能超过最大数量总数的行?

    介绍 我遇到了意想不到的挑战 我希望有人可以提供帮助 并且我对根据这个问题操作数据的最佳方法感兴趣 设想 我需要合并与两个不同 ID 列关联的列数据 我的每一行都关联一个 item id 和该 item id 的数量 请参阅下面的示例 cu
  • 在没有互联网的情况下连接 WIFI 时,可达性需要太长时间才能失败

    你好呀 我一直在使用可达性类 一切正常 除了 当设备连接到 wifi 时 无论出于何种原因 wifi 路由器没有互联网连接 可达性等级需要很长时间才能表明没有互联网 当根本没有网络 互联网连接时 它工作得很好 很快 例如 如果 wifi 关
  • 数据库错误没有这样的表django

    我在 django 项目 cc 中创建了一个新应用程序 api 我有一个远程数据库 launchg 我使用 Legacies 将其与 Django 集成并使用python manage py inspectdb gt models py生成
  • Javascript 图像对象 - 处理 onload 事件

    我正在尝试在点击事件上预加载图像 new image object var imgObject new Image assign the path to the image to the src property imgObject src
  • 如何在 vuejs 中导入并使用本地 .csv 文件

    我在这个结构中有一个 csv 文件 name year href src Parasite 2019 parasite 2019 film poster 4 2 6 4 0 6 426406 parasite 0 460 0 690 cro
  • 使用 LIKE 表达式时 SQLite 中的土耳其语字符

    select from urunler where musteri like ir 测试数据 musteri ID rem 1 Kadir 2 Demir 3 返回结果 Kadir Demir if use r 然后伊雷姆回来了 但卡迪尔和
  • 如何在SDL2中旋转矩形?

    我计划制作一个游戏 并且我想为该游戏创建一些背景动画 这些动画之一是旋转矩形 我已经查看了所有内容 但找不到任何形式的数学或逻辑可以让我旋转矩形 具体来说是 SDL Rect 但您可能已经知道了 我自己无法计算出数学公式 我真的没有任何可用
  • 将所有远程 git 分支作为本地分支进行跟踪

    将单个远程分支作为本地分支进行跟踪非常简单 git checkout track b branch name origin branch name 将所有本地分支推送到远程 根据需要创建新的远程分支也很容易 git push all ori
  • 如何保守应用程序的秘密?

    每个新的 Play 应用程序都会在其配置文件中生成一个新的应用程序密钥 application secret asdfadsfdasf 我正在开发一个将部署在 Heroku 上的开源应用程序 如何保守应用程序的秘密 例如 不将其提交到源代码
  • Constexpr 用于创建对象

    我试图弄清楚使用以下命令创建对象是否会带来性能提升constexpr而不是正常情况下 这是代码片段constexpr class Rect const int a const float b public constexpr Rect co
  • TFS Online - 从 0 开始 $(Rev.r)

    我在内部版本号中使用 Rev r 主要 次要 修订版 r 这非常有效 并且在每次构建时都会递增 并且如果主要或次要版本发生更改 则会重置 但编号从 1 开始 而不是 0 所以第一个版本不是 1 0 0 而是 1 0 1 这并不是我真正想要的
  • Visual Studio 2010可以自动将编译后的文件复制到另一个目录吗?

    我有两个项目 一个是编译为 EXE 的 VB6 项目 另一个是编译为 DLL 的 MSVC 2010 项目 DLL 需要与 EXE 文件位于同一文件夹中才能工作 我可以让 Visual Studio 2010 在编译后自动将编译后的 DLL
  • 打字稿不创建 dist 文件夹

    尝试编写打字稿项目 这是我的项目结构 rootdir src server ts other folders node modules tsconfig json package json tsconfig json compilerOpt
  • Python vs Matlab - 为什么我的矩阵在 python 中是奇异的

    我正在尝试将一些算法从 Matlab 转换为 Python 3 8 在算法中 我试图反转一些矩阵 结果是Matlab按照它应该做的那样反转矩阵 但Python 使用numpy linalg 说它不能反转奇异矩阵 经过一番调试 我们发现在Ma
  • 为什么 UDF 比子查询慢这么多?

    我有一个情况 我需要翻译 查找 同一个表中的多个值 我编写的第一种方法是使用子查询 SELECT SELECT id FROM user WHERE user pk created by AS creator SELECT id FROM
  • 在 JSON.NET 中转换用于反序列化的接口

    我正在尝试设置一个阅读器 它将从各个网站获取 JSON 对象 想想信息抓取 并将它们转换为 C 对象 我目前正在使用 JSON NET 进行反序列化过程 我遇到的问题是它不知道如何处理类中的接口级属性 所以一些自然的东西 public IT
  • XmlException:文档元素未出现 - 第 1 行,位置 1

    我正在尝试反序列化 xml 字符串 但由于某种原因 我收到标题中所述的错误 这是我要反序列化的代码 public void recieveObject
  • Visual Studio 2008 - 无法命中断点

    我知道很多人都遇到过这个问题 但我现在也遇到了这个问题并且无法解决问题 在完成一个项目数周后 VS 2008 随机给我一个错误 当我设置调试点时 我收到警告 当前不会命中断点 尚未为此文档加载任何符号 我已经重新构建了没有调试点的解决方案并
  • 测试重定向后加载的页面

    我有一个测试用例 应该验证在 POST 调用后 用户是否被重定向到正确的页面 Redirect Page in running FakeApplication val Some result route FakeRequest POST p
  • 多级子级上的 SwiftUI 更改已发布对象更改

    我有一个 ObservedObject AppStatus 类 它内部有多个 Published 类 如果我只在孩子方面有水平 一切都会很好 当我有一个 RecordingTimeManager 类 其中有另一个变量 2 级子级 时 问题就