swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)
我正在尝试实现一个 View ,该 View 可以在内容数组的大小发生变化时更改显示项目的数量(由 ForEach 循环创建),就像购物应用程序可能会在用户下拉刷新后更改其可用项目的数量一样
这是我到目前为止尝试过的一些代码。如果我没记错的话,这些适用于 Xcode beta 4,但适用于 beta 5:
- 如果数组的大小增加,循环仍将显示原始数量的元素
- 数组的大小减小会导致索引超出范围错误
代码:
import SwiftUIstruct test : View {@State var array:[String] = []@State var label = "not pressed"var body: some View {VStack{Text(label).onTapGesture {self.array.append("ForEach refreshed")self.label = "pressed"}ForEach(0..<array.count){number inText(self.array[number])}}
}
}#if DEBUG
struct test_Previews: PreviewProvider {static var previews: some View {test()}
}
#endif
一般来说,我是 SwiftUI 和 GUI 编程的新手,感觉每个内容都是在启动时定义的,之后很难进行更改(例如:在用户导航离开然后返回后重置 View ) .非常感谢循环问题的解决方案或使 View 更具动态性的任何提示!
最佳答案
Beta 5 发行说明说:
The retroactive conformance of Int to the Identifiable protocol is removed. Change any code that relies on this conformance to pass .self to the id parameter of the relevant initializer. Constant ranges of Int continue to be accepted:
List(0..<5) {Text("Rooms") }However, you shouldn’t pass a range that changes at runtime. If you use a variable that changes at runtime to define the range, the list displays views according to the initial range and ignores any subsequent updates to the range.
您应该更改 ForEach 以接收一个数组,而不是范围。理想情况下是 Identifiable 数组,以避免使用 \.self。但根据您的目标,这仍然有效:
import SwiftUIstruct ContentView : View {@State var array:[String] = []@State var label = "not pressed"var body: some View {VStack{Text(label).onTapGesture {self.array.append("ForEach refreshed")self.label = "pressed"}ForEach(array, id: \.self) { item inText(item)}}}
} 或者按照rob mayoff的建议,如果您需要索引:
struct ContentView : View {@State var array:[String] = []@State var label = "not pressed"var body: some View {VStack{Text(label).onTapGesture {self.array.append("ForEach refreshed")self.label = "pressed"}ForEach(array.indices, id: \.self) { index inText(self.array[index])}}}
} 关于swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5),我们在Stack Overflow上找到一个类似的问题: swift - How to refresh number of ForEach's displaying elements after array's size changes (SwiftUI, Xcode 11 Beta 5) - Stack Overflow
具有非恒定范围视图刷新的Swift ForEach
swift view swiftui-foreach
我知道这是一个简单的问题,但我还没有找到答案。我想了解基本概念。
我试图用非常量范围更新ForEach,closing参数是分配给按钮的变量。
变量被赋予@状态,因此应该刷新视图。不知怎么的,它不起作用了。
import SwiftUIstruct ContentView: View {@State private var numberOfTimes = 5let timesPicker = [2,5,10,12,20]@State private var tableToPractice = 2enum answerState {case unansweredcase wrongcase right}func listRange(){}var body: some View {NavigationView{HStack{VStack{Form{Section {Picker("Tip percentage", selection: $numberOfTimes) {ForEach(timesPicker, id: \.self) {Text($0, format: .number)}}.pickerStyle(.segmented)} header: {Text("How many times do you want to practice?")}Section{Stepper("Table to practice: \(tableToPractice.formatted())", value: $tableToPractice, in: 2...16 )}Button("Start Now", action: listRange).buttonStyle(.bordered)List{ForEach(0..<numberOfTimes){Text("Dynamic row \($0)")}}}.foregroundColor(.gray)}}}}
}struct ContentView_Previews: PreviewProvider {static var previews: some View {ContentView()}
}
发布于 1 年前
✅ 最佳回答:

问题是没有确定范围。让我们排几行
struct Row: Identifiable {let id = UUID()}
然后设置一组可识别的项目
@State private var numberOfTimes = 5@State private var rows = Array(repeating: Row(), count: 5)
现在,您可以获得响应列表
List{ForEach(rows) { row inText("Dynamic row")}}
调用更改时更新以重新创建阵列
.onChange(of: numberOfTimes) { newValue inrows = Array(repeating: Row(), count: newValue)numberOfTimes = newValue}
应在表单上调用onChange。
当您能够更好地查看模型数据时,这将更有意义,有关更深入的示例,请参阅apple文档。
这是针对lazy v stack的,但我考虑的是数据模型设置
https://developer.apple.com/documentation/swiftui/grouping-data-with-lazy-stack-views
最终解决办法:将FOREACH的列表改为@Published属性即可。
相关文章:
swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)
我正在尝试实现一个 View ,该 View 可以在内容数组的大小发生变化时更改显示项目的数量(由 ForEach 循环创建),就像购物应用程序可能会在用户下拉刷新后更改其可用项目的数量一样 这是我到目前为止尝试过的一些代码。如果我没记错的话,这些适…...
编程导航算法村第七关 |二叉树的遍历
编程导航算法村第七关 | 二叉树的遍历 前序遍历(递归) public List<Integer> preorderTraversal(TreeNode root) {ArrayList<Integer> result new ArrayList<Integer>();preorder(root, result);return result;}public void preorde…...
【docker】docker-compose安装带ui页面的kafka集群
docker-compose 安装带kafka-ui 的kafka集群 在日常的工作当中,kafka集群作为常用的中间件,其搭建过程略显繁琐,需要配置的文件颇多,为了方便各位初学者快速体验kafka的魅力,本文采取一键式安装kafka-3.3.1࿰…...
java实现多级菜单
/** * 查询所有菜单 */ public BaseWebResponse<Object> getAllMenus() { List<SystemMenuInfo> systemMenuInfoList menuInfoMapper.getAllMenus(); List<SystemMenuInfo> menuTree buildMenuTree(systemMenuInfoList); return setResultSuccess(&q…...
HTML中元素和标签有什么区别?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签(Tag)⭐元素(Element)⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…...
android 如何分析应用的内存(十三)——perfetto
android 如何分析应用的内存(十三) 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始,android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前,android使用syst…...
Chapter20 音乐
目录 音乐 琴键 哆来咪 振动与调式 利萨如曲线 和声与音调与和弦 音乐 在音乐理论中,一个八音度(octave)是一个频率范围相差二倍的区间。在大多数西洋乐器中,一个八音度被分为12个频率比相等的半音程(semitone&a…...
详解Nodejs中的模块化
Nodejs是一个基于Chrome V8引擎的JavaScript运行时环境,它允许开发者使用JavaScript在服务器端运行代码。在Nodejs中,模块化是一种组织和重用代码的重要方式。模块化允许我们将代码拆分成小块,使得代码结构更清晰、易于维护,并促进…...
debug思路 - maven构建报错
问题:maven面板中,进行compile、deploy操作时报错。 debug步骤: 1、鼠标右键选择“修改运行配置”。在运行命令中添加参数-X,用于产生执行调试输出。例如:compile -f -X pom.xml。 2、再次进行compile、deploy操作&…...
DSP学习笔记
间接寻址(通过放在辅助寄存器里面,可以对地址包括很多操作,1,-1,/-平移量,辅助寄存器内容的修改是在ARAU0和ARAU1中完成的。分为单操作数和双操作数,有很多模式在ARAU。单操作数间接寻址&#x…...
Java中的Apache Commons Math是什么?
Java中的Apache Commons Math是一个开源的数学库,它提供了许多常用的数学函数和算法,例如线性代数、微积分、统计、插值、拟合等。这个库对于需要处理大量数据的开发者来说非常有用,因为它可以大大简化代码并提高效率。 让我们从新手的角度来…...
规划路线(微信小程序、H5)
//地图getLocationDian(e1, e2) {console.log(e1, e2);let self this;self.xx1 [];self.xx2 [];self.points [];// self.markers[]console.log(self.markers, >marks);// self.$jsonp(url, data).then(re > {// var coors re.result.routes[0].polyline;// for (v…...
【CSS】视频文字特效
效果展示 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"container"&g…...
linux-MySQL的数据目录
总结: window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…...
AI绘图实战(十二):让AI设计LOGO/图标/标识 | Stable Diffusion成为设计师生产力工具
S:AI能取代设计师么? I :至少在设计行业,目前AI扮演的主要角色还是超级工具,要顶替?除非甲方对设计效果无所畏惧~~ 预先学习: 安装及其问题解决参考:《Windows安装Stable Diffusion …...
机器视觉系统设计:基础知识
机器视觉系统的设计 机器视觉系统集成是将各种不同的组件和子系统组合在一起并使它们充当单个统一系统的过程。 视觉系统集成包括光源,镜头,相机,相机接口和图像处理软件等等。您可能想知道如何设计和实现一个完整,成功的机器视…...
C# Blazor 学习笔记(11):路由跳转和信息传值
文章目录 前言路由跳转测试用例路由传参/路由约束想法更新:2023年8月4日 前言 Blazor对路由跳转进行了封装。 ASP.NET Core Blazor 路由和导航 NavigationManager 类 本文的主要内容就是全局的跳转 路由跳转 路由跳转就要用到NavigationManager 类。 其实最常用…...
Centos 7 安装 Python 时 zlib not available 错误解决
Centos 7 安装 Python 时 zlib not available 错误解决 报错信息, zipimport.ZipImportError: cant decompress data; zlib not available解决方法, sudo yum install -y zlib zlib-devel完结!...
python sqllite基本操作
以下是一些基本的SQLite3操作: 连接到数据库:使用sqlite3.connect()函数连接到数据库,返回一个Connection对象,我们就是通过这个对象与数据库进行交互。例如: import sqlite3 conn sqlite3.connect(example.db)创建…...
记录--基于css3写出的流光登录(注释超详细!)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 完整效果 对基本的表单样式进行设置 这里设置了基本的表单样式,外层用了div进行包裹,重点是运用了两个i元素在后期通过css样式勾画出一条线没在聚焦文本框的时候线会过度成一个…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
