【发布时间】:2021-02-21 12:53:05
【问题描述】:
我有一个非常简单的代码,我希望它尽可能简单,我正在使用 ForEach 来呈现一些简单的文本,为了了解正在秘密发生的事情,我制作了一个 TextView 以在每次调用此视图时得到通知通过 SwiftUI,不幸的是,每次我向数组中添加新元素时,SwiftUI 都会渲染从乞求到结束的所有数组元素,我想要并期望它仅为新元素调用 TextView,所以有一种方法来定义 可以解决问题的视图/文本数组,但是对于这样一个简单的工作来说,这太过分了,我的意思是我和你会在我们的项目中挑衅地使用 ForEach,我们可以在 ForEach 中使用一个简单的 Text 或任何其他自定义视图,我们如何解决这个问题以阻止 SwiftUI 一次又一次地初始化相同的东西,记住这一点,我只想使用一个简单的 String 数组而不是疯狂地定义一个 查看数组。
我的目标是使用一个简单的字符串数组来完成这项工作,而不必担心重新初始化问题。
也许是时候重新考虑在您的应用中使用 ForEach 了!
即使更新数组元素,SwiftUI 也会陷入重新渲染陷阱!这很有趣。因此,如果您有 50 行、100 行或 1000 行并且您只是更新 1 行,请做好准备,swiftUI 会重新渲染整个数组,无论您使用的是简单的 Text 还是 CustomView。所以我希望 SwiftUI 能够聪明地不再渲染所有数组,而只是进行必要的渲染以防万一。
import SwiftUI
struct ContentView: View {
@State private var arrayOfString: [String] = [String]()
var body: some View {
ForEach(arrayOfString.indices, id:\.self) { index in
TextView(stringOfText: arrayOfString[index])
}
Spacer()
Button("append new element") {
arrayOfString.append(Int.random(in: 1...1000).description)
}
.padding(.bottom)
Button("update first element") {
if arrayOfString.count > 0 {
arrayOfString[0] = "updated!"
}
}
.padding(.bottom)
}
}
struct TextView: View {
let stringOfText: String
init(stringOfText: String) {
self.stringOfText = stringOfText
print("initializing TextView for:", stringOfText)
}
var body: some View {
Text(stringOfText)
}
}
【问题讨论】:
标签: swiftui