在我现有的应用中,几乎没有UI配置,例如在所有视图控制器上设置自定义导航栏,设置全屏背景图像等等。为此,需要在viewWillAppear
中的基本视图控制器,所有视图控制器中进行配置,并从中继承配置。因此,无需在子视图控制器中进行任何操作即可进行配置]
如何使用SwiftUI实现类似的实现?
SwiftUI在View上提供了onAppear()
和onDisappear()
方法,该方法是Struct,不支持继承。如果我使用扩展方法或协议,则必须从所有视图调用方法。
感谢您的任何帮助...
制作您自己的容器视图。您可以使用@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())
结果: