swiftui - ScrollView 行为怪异(Xcode 11 GM 种子 - SwiftUI)
问题描述
我试图制作一个自定义列表。如果我们在 scrollView 中添加 Encapsulated VStack 并尝试从该 VStack 添加新行,它的行为就会很奇怪。但是我们必须封装,因为在 Xcode 中会给出“复杂视图编译器错误”。我提供了完整的代码以便更好地理解。请尝试运行它。新元素没有按预期添加,它推动一切向上。
struct RowView: View {
var body: some View {
VStack{
HStack{
Spacer()
.foregroundColor(Color.black)
Spacer()
}
}
.background(Color.white)
.cornerRadius(13)
.padding()
}}
struct cView:View {
@State var array: [String] = []
@State var height: CGFloat = 60
var body: some View {
VStack{
Button(action: {
self.array.append("Test")
}, label: {
Text("Add")
})
VStack{
ForEach(array, id: \.self){_ in
RowView()
}
}
.background(Color.red)
.cornerRadius(13)
.padding()
}
}}
struct ContentView : View {
@State var array: [String] = []
var body: some View {
ScrollView{
VStack{
Text("d")
.frame(height: 90)
VStack{
cView()
}
}
}
.navigationBarTitle("Test", displayMode: .automatic)
}}
解决方案
当我重新格式化并删除未使用的东西时,我得到了:
struct RowView: View {
let text: String
var body: some View {
VStack{
HStack{
Spacer()
Text(text).foregroundColor(Color.black)
Spacer()
}
}
.background(Color.white)
.cornerRadius(13)
.padding()
}
}
struct cView:View {
@State var array: [String] = []
@State var height: CGFloat = 60
var body: some View {
VStack{
Button(
action: { self.array.append("Test") },
label: { Text("Add") }
)
ForEach(array, id: \.self){text in
RowView(text: text)
}
.background(Color.red)
.cornerRadius(13)
.padding()
}
}
}
struct ContentView : View {
var body: some View {
List {
VStack{
Text("d")
cView()
}
}
}
}
ScrollView 是一个真正的 PITA,它讨厌 Text,这就是我用 List 替换它的原因。RowView 缺少文本恕我直言,所以我放了一个。 ContentView 中的数组从未使用过,所以我删除了它,类似地,navigatinBarTitle 需要 NavigationView。
这并不是真正的答案,因为它使用 List 而不是 ScrollView,但它确实指出了您的问题所在。这也很奇怪,因为每件事都在一个列表行中,但我试图尽可能少地改变。
您可能想尝试在您的代码上运行 SwiftLint。我经常对它发誓,尤其是当它抱怨我的枚举开关的圈复杂性时,但它确实改进了我的代码。
推荐阅读
- c# - 使用身份通过 id 获取用户名
- c - 从结构数组创建链表图
- python - 使用 chrome selenium webdriver 时如何避免超时错误
- python - pyclean 和 py3clean 的区别
- c++ - 为什么模板参数解包有时不适用于 std::function?
- linux - 由于缺少 Build.include 文件,在 Ubuntu 20.04 中为 objtool 制作失败?
- c# - 当应用程序在不同用户下运行时,如何在 Linux 上远程调试 C#/.Net 应用程序?
- powerpoint - 如何确定单元格是否在 PowerPoint 中垂直合并?
- webrtc - WebRTC 在本地工作,但不能通过 Internet
- android - 从 RecyclerView Adapter Android 隐藏和显示多个视图持有者