我在试着做一份定制的清单。如果我们在scrollView中添加封装的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)
}}发布于 2019-09-13 14:34:30
当我重新格式化并删除未使用的内容时,我得到:
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,它讨厌文本,这就是为什么我用一个列表来代替它。RowView遗漏了一个文本IMHO,所以我加了一个。ContentView中的数组从未使用过,所以我删除了它,类似地,navigatinBarTitle需要一个NavigationView。
这不是一个真正的答案,因为它使用List而不是ScrollView,但它确实指出了您的问题所在。这也很奇怪,因为所有的东西都在一个单独的列表行中,但我试图尽可能少地更改。
您可能希望尝试在代码上运行SwiftLint。我经常骂它,特别是当它抱怨我的枚举开关的圈复杂度时,但它确实改进了我的代码。
发布于 2019-09-13 16:48:59
很可能是一个bug,但我不需要封装。如果我不这样做,代码就会按预期运行:
struct RowView: View {
var body: some View {
VStack{
HStack{
Spacer()
.foregroundColor(Color.black)
Spacer()
}
}
.background(Color.white)
.cornerRadius(13)
.padding()
}
}
struct ContentView : View {
@State var array: [String] = []
@State var height: CGFloat = 60
var body: some View {
ScrollView{
VStack{
Text("d")
.frame(height: 90)
VStack{
Button(action: {
self.array.append("Test")
}, label: {
Text("Add")
})
VStack{
ForEach(array, id: \.self){_ in
RowView()
}
}
.background(Color.red)
.cornerRadius(13)
.padding()
}
}
}
.navigationBarTitle("Test", displayMode: .automatic)
}
}https://stackoverflow.com/questions/57916502
复制相似问题