为什么 ObservedObject 数组未在我的 SwiftUI 应用程序中更新?

2023-12-10

我正在玩 SwiftUI,试图了解如何ObservableObject作品。我有一个数组Person对象。当我添加一个新的Person到数组中,它会重新加载到我的视图中,但是如果我更改现有的值Person,它不会重新加载到视图中。

//  NamesClass.swift
import Foundation
import SwiftUI
import Combine

class Person: ObservableObject,Identifiable{
    var id: Int
    @Published var name: String
    
    init(id: Int, name: String){
        self.id = id
        self.name = name
    }
}

class People: ObservableObject{
    @Published var people: [Person]
    
    init(){
        self.people = [
            Person(id: 1, name:"Javier"),
            Person(id: 2, name:"Juan"),
            Person(id: 3, name:"Pedro"),
            Person(id: 4, name:"Luis")]
    }
}
struct ContentView: View {
    @ObservedObject var mypeople: People
    
    var body: some View {
        VStack{
            ForEach(mypeople.people){ person in
                Text("\(person.name)")
            }
            Button(action: {
                self.mypeople.people[0].name="Jaime"
                //self.mypeople.people.append(Person(id: 5, name: "John"))
            }) {
                Text("Add/Change name")
            }
        }
    }
}

如果我取消注释该行以添加新的Person(约翰),Jaime 的名字显示正确,但是如果我只是更改名称,则不会在视图中显示。

我担心我做错了什么或者我不明白如何ObservedObjects使用数组。


您可以使用结构而不是类。由于结构体的值语义,对人员姓名的更改被视为对 Person 结构体本身的更改,并且此更改也是对人员数组的更改,因此 @Published 将发送通知,并且视图主体将被重新计算。

import Foundation
import SwiftUI
import Combine

struct Person: Identifiable{
    var id: Int
    var name: String

    init(id: Int, name: String){
        self.id = id
        self.name = name
    }

}

class Model: ObservableObject{
    @Published var people: [Person]

    init(){
        self.people = [
            Person(id: 1, name:"Javier"),
            Person(id: 2, name:"Juan"),
            Person(id: 3, name:"Pedro"),
            Person(id: 4, name:"Luis")]
    }

}

struct ContentView: View {
    @StateObject var model = Model()

    var body: some View {
        VStack{
            ForEach(model.people){ person in
                Text("\(person.name)")
            }
            Button(action: {
                self.mypeople.people[0].name="Jaime"
            }) {
                Text("Add/Change name")
            }
        }
    }
}

或者(不推荐),Person是一个类,所以它是一个引用类型。当它发生变化时,People数组保持不变,因此主体不会发出任何内容。但是,您可以手动调用它,让它知道:

Button(action: {
    self.mypeople.objectWillChange.send()
    self.mypeople.people[0].name="Jaime"    
}) {
    Text("Add/Change name")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ObservedObject 数组未在我的 SwiftUI 应用程序中更新? 的相关文章

  • SwiftUI navigationBarTitle - 显示模式:.inline - 崩溃

    我的 SwiftUI 有问题 我正在创建一个带有导航栏的列表 并且我想将导航栏模式设置为内联 我不希望它太大 默认情况下 但是当我将导航栏标题模式设置为内联时 应用程序崩溃了 struct User var index Int var na
  • 更新 @EnvironmentObject var 以将数据传递到 SwiftUI 中的 PageViewController 会导致 ViewController 之间的滑动丢失

    在我的 SwiftUI 应用程序中 我目前有一个使用 UIKit 实现的 PageViewController 它遵循 Apple 的 SwiftUI UIKit 集成中概述的传统 SwiftUI UIKit 实现教程 https deve
  • SwiftUI NavigationView 从其内部开始

    因此 我在页面视图样式的 TabView 中嵌入了一个 NavigationView 首次加载时 NavigationView 将在其内部启动 然后重新加载后即可正常显示 我不确定是什么原因造成的 我制作了一个 GIF 来更好地说明问题 这
  • SwiftUI 有模糊背景的方法吗?

    我希望模糊视图的背景 但不想必须突破 UIKit 才能完成它 例如 UIVisualEffectView 我正在翻阅文档却一无所获 似乎没有办法实时剪辑背景并对它应用效果 我错了还是以错误的方式看待它 1 Native SwiftUI方式
  • 如何修复TabView中NavigationView中List下的灰色条?

    所以我遇到一个问题 在我的列表下方出现一个灰色条 当我单击一个单元格转到另一个视图时 会出现一个更大的灰色条 这是列表视图的代码 VStack NavigationView VStack List ForEach answersArray
  • 使 Picker 与其他 BinaryInteger 类型兼容

    Picker仅当与以下一起使用时才能正常工作Int 当使用任何其他类型的BinaryInteger它根本不更新选择 为了解决这个问题 我想做一个CompatilibityPicker但我必须承认我的理解Binding实际上工作给我带来了很多
  • SwiftUI 表单中的动态行高

    我正在向 SwiftUI 表单添加控件以帮助用户输入数据 并限制条目 尽管 Forms 有很多值得喜欢的地方 但我发现在该容器之外运行良好的东西在容器内却会发生非常意想不到的事情 并且如何弥补这一点并不总是显而易见的 计划是将数据字段显示为
  • SwiftUI - ForEach 与 Stride

    我试图创建一个 Hstack d 卡列表 也就是说 我想创建一系列行的滚动视图 每行将包含一个 HStack 其中两个视图并排显示 并由某种列表数据结构初始化 struct MyHStackView View var myArray Som
  • 当我输入字符时,SwiftUI 中的 TextField 失去焦点

    当我在文本字段中输入字符时遇到问题 在练习集视图 我必须重新单击文本框才能输入另一个字符 如果我从文本字段中删除绑定 我可以流畅地输入文本 我认为这与我的演讲者班级和更新集函数重新创建一个集合实例 因为我必须替换数组中两层深处的一些值 Co
  • SwiftUI:发送电子邮件

    在正常情况下UIViewController在 Swift 中 我使用此代码发送邮件 let mailComposeViewController configuredMailComposeViewController mailCompose
  • SwiftUI:隐藏键盘但显示光标

    我想使用自定义按钮将文本输入到TextField 但仍显示并移动光标 有没有办法隐藏默认键盘 同时仍然显示光标 我希望有这样的事情 TextField text text keyboardType none 这是它目前的样子 您可以使用UI
  • 在其他数组中使用 ForEach 的索引

    为什么我不能使用 FromEach 的索引作为其他数组的索引 这个索引是Int 那么有什么问题呢 var word String return slova selector var symbols Array
  • 处理 SwiftUI 视图中的可选值/nil 值 - 在 SwiftUI 中使用 if let [重复]

    这个问题在这里已经有答案了 视图通常不允许可选参数值 从而导致类似的错误Initializer init requires that String conform to StringProtocol struct Person var na
  • SwiftUI 全屏图像背景

    我想在背景中显示全屏图像 我已经实现了这个 struct LoginView View var body some View VStack Spacer Text Hallo Text Hallo2 Text Hallo2 Text Hal
  • SwiftUI 中的多行文本视图[重复]

    这个问题在这里已经有答案了 如何设置Text查看以多行显示文本 默认情况下为 1 行 struct ContentView View var body some View Text Lorem ipsum dolor sit amet co
  • SwiftUI Switch 语句转换行为不符合预期

    我越来越出乎意料 transition使用时的行为switch更新视图的语句与使用两个语句时的比较if声明 他们俩if语句正在按预期将视图滑入和滑出 但是 相同的转换switch语句导致视图从一侧滑入并从另一侧退出 我正在寻找使用switc
  • 如何在 SwiftUI 中声明“全局@State变量”?

    我是 SwiftUI 新手 目前正在构建我的第一个应用程序 但是 我有一个问题 我正在编写一个多视图应用程序 在其中我想使用某种全局变量以便能够从我的所有视图访问和编辑它们 例如 我在应用启动时询问用户的 性别 体重 和 许可证 但是 我也
  • SwiftUI:如何使用 @Binding 变量实现自定义 init

    我正在制作金钱输入屏幕 我需要实施自定义init根据初始化量设置状态变量 我认为以下方法会起作用 struct AmountView View Binding var amount Double State var includeDecim
  • 文本字段中的 SwiftUI 颜色输入

    我遇到了 SwiftUI 的问题 当用户输入文本字段时 我需要将文本字段中的所有字母设置为红色 将所有数字设置为黑色 假设我有这个代码 TextField A99 text viewModel code padding trailing m
  • 如何将 UserDefaults 与 SwiftUI 结合使用?

    struct ContentView View State var settingsConfiguration Settings struct Settings var passwordLength Double 20 var moreSp

随机推荐

  • 如何禁用在肥皂中编码的身体数据,改造请求

    我有一个请求数据 其中一个元素采用 xml 作为值 使用以下方式将数据发送到服务器时 Body我的内部 xml 正在被编码 html 编码 因为该服务在服务器端失败 如何禁用内部xml 正在编码 sample
  • MPMovieplayerController 在后台时不播放下一个 URL

    我正在开发一个 iOS 应用程序 在其中使用 MPMoviePlayerController 流式传输 mp3 文件 当一个文件的播放完成时 我获取下一个 url 并播放该文件 所有内容在前台都运行良好 但是当我将应用程序移动到后台时 当前
  • 根据政策列表进行授权

    我正在开发不同的应用程序 每个应用程序都有自己的角色成员 在 Startup cs 中 var c configuration GetSection nameof Configuration Get
  • R:将标签从矩阵添加到图形

    我正在使用 R 编程语言 我生成了这个随机网络图和矩阵 library tidyverse library visNetwork library htmlwidgets set seed 123 mat lt matrix runif 19
  • 卸载后如何打开网站?

    软件安装后我可以打开一个网站 如下所示 Run Filename http example com Flags shellexec runasoriginaluser 有没有办法在软件卸载后打开另一个网站 要在卸载完成后打开不可执行的文件
  • CPAN 将模块安装到 perl5 而不是 site_perl

    我正在尝试将一些 cpan 模块临时安装到自定义文件夹 tmp perl 中 所以我修改了构建安装基础 o conf mbuildpl arg install base tmp perl o conf makepl arg INSTALL
  • 从 C# 代码将数据插入 SQL Server

    我有一张桌子student id name 然后我有一个文本框 用于输入名称 当单击提交按钮时 它将数据插入数据库 那么我怎样才能只插入名称 而不插入id 因为id是自动递增的呢 我试过这个 insert into student id n
  • Maven 和 Eclipse 使用的 Checkstyle 配置

    我尝试在 Maven 和 Eclipse 中使用相同的 Checkstyle 配置文件 模块 SuppressionCommentFilter 在 Eclipse 中按预期工作 但 Maven 报告 不允许 TreeWalker 作为 Su
  • 具有相同内容的两个字符串何时(不)共享相同的内存?

    来自问题两个内容相同的字符串会存储在同一个内存位置吗 拥有Java代码 String s1 Java 该字符串是否会分配在同一内存位置 或多个 是否多次启动同一个程序并并行 同时 执行它 可能的答案 我目前是 C 开发人员 尽管在上个世纪是
  • 将值数组发送到 Oracle 过程以在 WHERE IN 子句中使用

    我在Oracle中有一个存储过程 如下所示 CREATE PROCEDURE MY TEST PROC CUR OUT SYS REFCURSOR PARAM THAT WILL BE USED INSIDE WHERE IN AS BEG
  • 用Java读取svg路径数据的最简单方法? [复制]

    这个问题在这里已经有答案了 我希望使用 svg 图像并解析 处理不同的路径来进行自定义转换 在Java中 简单提取路径数据的最简单方法是什么 我正在查看 apache xmlgraphics batik 包 但如何返回路径类型和参数并不明显
  • ActiveMQ:通过JMX获取连接列表?

    如何获取ActiveMQ OpenWire 连接器的连接列表 JConsole 能够列出连接 但我看不到可以使用哪个 视图 来获取列表 连接的对象名称示例 org apache activemq BrokerName localhost T
  • 在 JavaFX 2 中播放带字幕的视频

    我注意到 JavaFX 1 有一个SubtitleTrack用于从视频文件中提取字幕的类 但我在 JavaFX 2 中找不到等效的功能 javafx scene media似乎不存在 这个功能是否已经实现了 在什么情况下它转移到了哪里 或者
  • Appium 和 Selenium 网格的并行测试

    我正在尝试使用 appium 和 selenium 网格在 2 个设备上运行并行测试 但由于某种原因 它仅在第一个节点服务器 和第一个设备 上运行 但在第二个服务器上没有任何反应 另外 如果我关闭第一台服务器并运行测试 那么测试将在第二台服
  • Boost asio 处理程序不会保持 io_service 运行

    我想向 boost io service 添加一个信号处理程序 允许应用程序在用户按下 Ctrl C 时彻底关闭 这当然可以通过停止循环轻松完成 如下所示 boost asio io service service boost asio s
  • FB.ui 弹出窗口未关闭

    初始化代码 FB init appId 123456789012345 channelUrl http localhost Some Url FacebookChannel status true cookie true oauth tru
  • 如何将接收字节图像的对象转换为实际图像?

    我正在用 C 开发智能设备应用程序 我正在调用网络服务 Web 服务方法返回谷歌地图 该方法的返回类型是对象 该对象包含字节格式的图像 该对象包含 base64binary 格式的图像 我需要在我的应用程序中显示实际图像 我需要进行什么类型
  • jpa2/eclipselink 合适的 DAO 结构是什么?

    我有 JPA 实体并且需要用它们执行逻辑 到目前为止 一个巨大的静态数据库类完成了这项工作 它很丑陋 因为每个公共接口方法都有一个使用 EntityManager 的私有等效方法来执行事务 但我也可以通过静态 em 来解决这个问题 然而我想
  • gfortran 需要格式宽度而 ifort 不需要?

    我正在尝试将 FOR 文件 出于练习目的 从 ifort 迁移到 gfortran 该文件在我的 Intel Visual Fortran 解决方案中编译时没有任何问题 但是 当我使用以下命令在 gfortran 中编译它时 gfortra
  • 为什么 ObservedObject 数组未在我的 SwiftUI 应用程序中更新?

    我正在玩 SwiftUI 试图了解如何ObservableObject作品 我有一个数组Person对象 当我添加一个新的Person到数组中 它会重新加载到我的视图中 但是如果我更改现有的值Person 它不会重新加载到视图中 Names