swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)

这篇具有很好参考价值的文章主要介绍了swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我正在尝试实现一个 View ,该 View 可以在内容数组的大小发生变化时更改显示项目的数量(由 ForEach 循环创建),就像购物应用程序可能会在用户下拉刷新后更改其可用项目的数量一样

这是我到目前为止尝试过的一些代码。如果我没记错的话,这些适用于 Xcode beta 4,但适用于 beta 5:

  • 如果数组的大小增加,循环仍将显示原始数量的元素
  • 数组的大小减小会导致索引超出范围错误

代码:

import SwiftUI

struct 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 in
                Text(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 SwiftUI

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, id: \.self) { item in
                Text(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 in
                Text(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 SwiftUI

struct ContentView: View {
    @State private var numberOfTimes = 5
    let timesPicker = [2,5,10,12,20]
    @State private var tableToPractice = 2
    enum answerState {
        case unanswered
        case wrong
        case 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 年前

✅ 最佳回答:

swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5),xcode

问题是没有确定范围。让我们排几行

    struct Row: Identifiable {
        let id = UUID()
    }

然后设置一组可识别的项目

    @State private var numberOfTimes = 5
    @State private var rows = Array(repeating: Row(), count: 5)

现在,您可以获得响应列表

    List{
        ForEach(rows) { row in
            Text("Dynamic row")
        }
    }

调用更改时更新以重新创建阵列

    .onChange(of: numberOfTimes) { newValue in
        rows = 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属性即可。文章来源地址https://www.toymoban.com/news/detail-623076.html

到了这里,关于swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AD20/Altium designer——如何对PCB外框进行裁剪、更改板子形状大小

      本篇将介绍在AD软件中,原理图转PCB后如何对其外形进行编辑 Shift+鼠标左键    多选   或   鼠标单击线条+ Tab 步骤:设计→板子形状→按照选择对象定义 快捷键:D→S→D  

    2024年02月11日
    浏览(97)
  • idea提交代码时gitee显示别人的名字,如何更改git信息

    在公司中刚入职只能用别人的账号,导致一直都是用别人的账号提交代码 点击应用,最后重启idea中,就会让你重新输入账号和密码,更改完之后可以再次勾选回原来状态,就不用重启再输入密码 代码如下(示例): 代码如下(示例): 以上就是今天要讲的内容,本文仅仅

    2024年02月03日
    浏览(49)
  • Python 中如何向列表或数组添加元素

    编程中的数组是一个有序的项目集合,所有的项目都需要是相同的数据类型。 然而,与其它编程语言不同,数组在 Python 中不是一个内置的数据结构。Python 使用列表取代传统的数组。 列表本质上是动态数组,是 Python 中最常见的和最强大的数据结构之一。 你可以把它们想象

    2024年02月11日
    浏览(32)
  • iOS:如何安全且优雅地操控数组元素

    在 iOS 开发的世界里,数组(Array)的操作频率高得令人咋舌。数组贯穿于我们每一个功能的实现和每一行代码的编写之中,一手托起了数据结构的半边天。但这位工具之王,有时候也会变身为导致程序崩溃的罪魁祸首。当访问越界,当插入失误,不经意间,崩溃就在不经意的一

    2024年04月09日
    浏览(26)
  • matlab的imshow()如何以合适大小显示图片

    如果使用imshow(a)则显示出来的图像过小,我们可以使用下句,来显示合适大小的图像 imshow(a,InitialMagnification = \\\'fit\\\')

    2024年02月16日
    浏览(30)
  • 【Swift/Objective-c】公司项目优化(二) - 下拉刷新抖动问题

    使用MJRefresh进行列表下拉刷新时,会出现列表上下颤抖问题 抖动的原因 我们先来看看在手松开之后我们对scrollView做了什么事情: ScrollViewDidEndDragging  =  setContentInset: 为了保证在“Loading”的状态下,下拉刷新控件可以展示,我们对contentInset做了修改,增加了inset的top. 那这样

    2024年01月20日
    浏览(29)
  • foreach无法修改数组值解决方案

    效果展示: 解决办法: 这里小编解释下,将 this 赋值给 that 通常是为了在回调函数或者异步代码中保持对Vue实例的访问 如若有帮助,可以给小编点个赞!!这是对小编最大的支持~

    2024年04月13日
    浏览(21)
  • Swift之struct二进制大小分析

    作者:京东零售 邓立兵 随着Swift的日渐成熟和给开发过程带来的便利性及安全性,京喜App中的原生业务模块和基础模块使用Swift开发占比逐渐增高。本次讨论的是struct对比Class的一些优劣势,重点分析对包体积带来的影响及规避措施。 1、类型对比 引用类型: 将一个对象赋值

    2024年01月20日
    浏览(27)
  • idea如何设置通过鼠标去改变字体的大小,idea如何进行作者署名以及时间显示

    目录 一、idea如何设置通过鼠标去改变字体的大小 步骤: 1、缩小字体  2、放大字体 二、idea如何进行作者署名以及时间显示 步骤:  设置settings——键盘设置keymap——缩小字体decrease——右击decrease font size添加鼠标快捷键add mouse shortcut——ctrl+鼠标下滑缩小字体(当然你可以上

    2024年02月14日
    浏览(42)
  • 【vue】更改角色权限后,实现页面不刷新更改其可展示的导航菜单

    登入的角色本身属于领导级别(集团权限),没有下级的不同权限: 切换不同身份(公司),以获得相应部门的不同导航菜单及权限 这里实现:更改角色权限后,实现页面 不刷新 更改其展示出来的 导航菜单 1、在右上角页面代码内,通过后端接口获取子角色(公司)的对应

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包