首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >文本未显示,但onAppear触发器

文本未显示,但onAppear触发器
EN

Stack Overflow用户
提问于 2019-07-15 08:01:51
回答 1查看 501关注 0票数 0

我正在尝试在HStack和VStack中使用forEach。我在它们中使用文本,运行时文本不会出现,但onAppear打印值。请看一下我的代码。为什么文本不显示?我怎么才能让它工作呢?

代码语言:javascript
复制
@State var sd = ["1","2","3","4","5","6","7"]

VStack {
    ForEach(0...sd.count/3) { _ in
        HStack {
            ForEach(0...2) { _ in
                if(self.sd.isEmpty) {
                } else {
                    Text("Test")
                        .onAppear() {
                            if(!self.sd.isEmpty) {
                                print("i appeared")
                                self.sd.removeFirst()
                            }
                    }
                }
            }
            Spacer()
        }
    }
}

我在这里想要实现什么?

我正在尝试创建一个最多3个文本在它的HStacks。我在这里只使用数组来渲染文本7次。

具有7个元素的数组的预期结果->

我想创建一个3 HStacks的VStack,在第一个2 HStacks我想渲染文本3次,在最后的HStack我只想要一个文本。(比如我有7个数组元素,这就是为什么前两个hstack中有3个文本,最后一个hstack中有一个文本)。如果数组有10个元素,那么3个Hstack包含3个文本,last Stack包含1个文本。我无法呈现文本,因为我的数组是@state var,每次我从其中删除firstElement时,它都会刷新view.body。

有没有办法实现这个行为,我正在尝试通过只使用SwiftUI来实现。我不想使用UICollection视图。

EN

回答 1

Stack Overflow用户

发布于 2019-07-15 08:53:45

您通常不希望更改@State变量作为body求值的副作用;在这种情况下,self.sd.removeFirst()会导致body被标记为需要重新求值,因此SwiftUI会一直调用它,直到您的sd数组为空,这就是为什么您看不到任何呈现的原因。

要获得你想要的效果,这是一种你可以做到的方法:

代码语言:javascript
复制
import SwiftUI

struct ContentView : View {
    @State private var sd = ["1","2","3","4","5","6","7"]
    private let columns = 3

    var body: some View {
        VStack {
            ForEach(Array(stride(from: 0, to: sd.count, by: columns))) { row in
                HStack {
                    ForEach(0..<self.columns) { col in
                        if row + col < self.sd.count {
                            Text("\(self.sd[row + col])")
                        }
                    }
                }
            }
        }
    }
}

附注:大多数在body评估中修改状态的尝试似乎都会导致运行时警告Modifying state during view update, this will cause undefined behavior. -似乎您的数组突变以某种方式绕过了这一检查,但希望这种事情将在未来的运行时被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57032007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档