没有顶级容器的情况下视图效果可能出乎意料,因为当一个视图嵌入另外一个视图的时候,相当于内容直接嵌入,而不是作为一个包装的子视图。

        举个例子,TabView的每个子项都被当作一个页面,如果嵌入的页面没有顶级容器,就会展现为多个页面。视图默认是类似VStack的纵向排列,单独看和有顶级VStack效果是一样的。

        总入口的代码:

     @State var bindingstr = "bindingstr"
     var body: some View {
        HStack {
            Spacer()
            VStack {
                Spacer()
                TabView{
                    SwiftUIViewEnv(info:$bindingstr)
                    SwiftUIViewGesture()
                    SwiftUIViewScroll()
                    SwiftUIViewPopup()
                    SwiftUIViewRGB()
                    SwiftUIViewForm()
                    Text("You are welcome")
                    Text("You are welcome")
                    Text("You are welcome")
                }

        这是个TabView,有好多页面,我们关注第一个页面,第一个页面的代码:

import SwiftUI

class EnvModel: ObservableObject{
    @Published var info = "env"
    @AppStorage("setting") var setting = "setting"
}
struct SwiftUIViewEnv: View {
    @Binding var info : String
    @EnvironmentObject var env: EnvModel
    @EnvironmentObject var env2: EnvModel
    var body: some View {
        //VStack{
            Text(info)
            Text(env.info)
                .onTapGesture {
                    env.info += "1"
                }
            Text(env.setting)
                .onTapGesture {
                    env.setting += "1"
                }
            Text(env2.info)
                .onTapGesture {
                    env2.info += "a"
                }
            Text(env2.setting)
                .onTapGesture {
                    env2.setting += "a"
                }
        //}
    }
}

#Preview {
    var info = "abc"
    SwiftUIViewEnv(info: Binding.constant(info)).environmentObject(EnvModel())
}

        顶级容器VStack屏蔽了,单独预览效果:

        前面的总入口的预览效果:

        对应单独预览的第一行“abc”(因为传入的参数不同),滑动到下一页:

        再下一页:

        很明显,这是因为嵌套页面没有顶级容器造成的。打开顶级VStack容器:

        这才是我们想要的效果。

        

更多推荐