SwiftUI |如何覆盖生命周期方法,例如viewWillAppear

问题描述 投票:0回答:1

在我现有的应用中,几乎没有UI配置,例如在所有视图控制器上设置自定义导航栏,设置全屏背景图像等等。为此,需要在viewWillAppear中的基本视图控制器,所有视图控制器中进行配置,并从中继承配置。因此,无需在子视图控制器中进行任何操作即可进行配置]

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

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

感谢您的任何帮助...

ios swift swiftui
1个回答
0
投票

制作您自己的容器视图。您可以使用@ViewBuilder来使您的视图像VStackHStack一样运行,在此情况下,内容封闭会充满子视图。

例如,这是一个自定义容器,它为主要内容赋予粉红色背景,并在其下放置一个工具栏:

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

© www.soinside.com 2019 - 2024. All rights reserved.