代码之家  ›  专栏  ›  技术社区  ›  Khawar

SwiftUI |如何覆盖像viewWillAppear这样的生命周期方法

  •  0
  • Khawar  · 技术社区  · 4 年前

    在我现有的应用程序中,很少有UI配置,比如在所有视图控制器上设置自定义导航栏、设置全屏背景图像等等。为此,在中的基本视图控制器中进行配置 viewWillAppear

    如何使用SwiftUI实现类似的实现?

    迅捷提供 onAppear() & onDisappear() 方法,它是Struct并且不支持继承。如果我做扩展方法或协议,我必须从所有视图调用方法。

    感谢您的帮助。。。

    0 回复  |  直到 4 年前
        1
  •  5
  •   rob mayoff    4 年前

    创建自己的容器视图。你可以用 @ViewBuilder VStack HStack 它需要一个充满子视图的内容闭包。

    import SwiftUI
    
    struct CustomContainer<Content: View>: View {
        init(@ViewBuilder content: () -> Content) {
            self.content = content()
        }
    
        let content: Content
    
        var body: some View {
            VStack(spacing: 0) {
                content
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .background(Color(hue: 0, saturation: 0.3, brightness: 1))
                Toolbar()
            }
        }
    }
    
    struct Toolbar: View {
        var body: some View {
            HStack {
                Spacer()
                button("person.3.fill")
                Spacer()
                button("printer.fill")
                Spacer()
                button("heart.fill")
                Spacer()
                button("bubble.left.fill")
                Spacer()
            } //
                .frame(height: 44)
        }
    
        private func button(_ name: String) -> some View {
            Image(systemName: name)
                .resizable()
                .aspectRatio(contentMode: .fit)
                .padding(4)
                .frame(width: 40, height: 40)
        }
    }
    

    下面是一个使用它的视图:

    struct HelloView: View {
        var body: some View {
            CustomContainer {
                VStack {
                    Text("hello")
                    Text("khawar")
                }
            }
        }
    }
    
    import PlaygroundSupport
    PlaygroundPage.current.setLiveView(HelloView())
    

    output showing some content inside the custom container