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

Kha*_*war 0 ios swift swiftui

在我现有的应用程序中,几乎没有 UI 配置,例如在所有视图控制器上设置自定义导航栏、设置全屏背景图像等等。为此,在viewWillAppear所有视图控制器中的基本视图控制器中进行配置并从它继承。所以配置是在子视图控制器中不做任何事情的情况下进行的

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

SwiftUI在 View 上提供了onAppear()&onDisappear()方法,它是 Struct,不支持继承。如果我制作扩展方法或协议,我必须从所有视图调用方法。

任何帮助表示赞赏...

rob*_*off 5

制作您自己的容器视图。您可以使用@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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后这是一个使用它的视图:

struct HelloView: View {
    var body: some View {
        CustomContainer {
            VStack {
                Text("hello")
                Text("khawar")
            }
        }
    }
}

import PlaygroundSupport
PlaygroundPage.current.setLiveView(HelloView())
Run Code Online (Sandbox Code Playgroud)

结果:

输出显示自定义容器内的一些内容