【发布时间】:2021-01-20 20:39:16
【问题描述】:
目标:使用包含共享标题Text()的通用标题视图。
场景:我有多个视图共享一个公共选项卡空间在一个容器选项卡视图中,其中包含要共享的结构标题。
????这是一个(很多:1)场景。
注意:我不想使用 NavigationView,因为它会破坏横向模式。一个简单的小标题视图就可以了。我只需要在成员视图中填充共享标题空间。
我不想仅仅为每个成员视图添加重复的标题(具有完全相同的布局)。
几个想法:我需要标题来响应“更改标题”事件,这样我才能看到新标题。
所以我相信我可以使用 1) @Binder(每个成员 View) --> @State (shared Header View) 或
2) @Environment。
我不知道如何将#1 融入这个特定场景。
所以我在玩#2:环境对象。
DesignPattern: Main Header View 的标题由多个 View 设置,因此 Header View 不知道多个 View:
我没有让 EnvironmentObject 范式工作。
这是代码...
主视图:
import SwiftUI
// Need to finish this.
class NYTEnvironment {
var title = "Title"
var msg = "Mother had a feeling..."
}
class NYTSettings: ObservableObject {
@Published var environment: NYTEnvironment
init() {
self.environment = NYTEnvironment()
}
}
struct NYTView: View {
var nytSettings = NYTSettings()
@State var selectionDataSegmentIndex = 0
var bindingDataSourceSegment: Binding<Int> {
.init(get: {
selectionDataSegmentIndex
}, set: {
selectionDataSegmentIndex = $0
})
}
var body: some View {
let county = 0; let state = 1; let states = 2
VStack {
NYTHeaderView()
SegmentAndDataPickerVStack(spacing: 10) {
if let segments = Source.NYT.dataSegments {
Picker("NYT Picker", selection: bindingDataSourceSegment) {
ForEach(segments.indices, id: \.self) { (index: Int) in
Text(segments[index])
}
}.pickerStyle(SegmentedPickerStyle())
}
}
if selectionDataSegmentIndex == county {
NYTCountyView()
} else if selectionDataSegmentIndex == state {
NYTStateView()
} else if selectionDataSegmentIndex == states {
NYTStatesView()
}
Spacer()
}.environmentObject(nytSettings)
}
struct TrailingItem: View {
var body: some View {
Button(action: {
print("Info")
}, label: {
Image(systemName: "info.circle")
})
}
}
}
// ====================================================================================
struct NYTHeaderView: View {
@EnvironmentObject var nytSettings: NYTSettings
var body: some View {
ZStack {
Color.yellow
Text(nytSettings.environment.title)
}.frame(height: Header.navigationBarHeight)
}
}
修订:我在 memberViews() 中添加了 EnvironmentObject 修饰符:
if selectionDataSegmentIndex == county {
NYTCountyView().environmentObject(NYTSettings())
} else if selectionDataSegmentIndex == state {
NYTStateView().environmentObject(NYTSettings())
} else if selectionDataSegmentIndex == states {
NYTStatesView().environmentObject(NYTSettings())
}
...
主容器/选项卡视图中的成员视图之一(如上所述):
struct NYTCountyView: View {
@ObservedObject var dataSource = NYTCountyModel()
@EnvironmentObject var nytSettings: NYTSettings
...
...
}.onAppear {
nytSettings.environment.title = "Selected Counties"
if dataSource.revisedCountyElementListAndDuration == nil {
dataSource.getData()
}
}
Spacer()
...
}
这是编译时错误:
作案手法:在 .onAppear() 上为每个成员视图设置带有标题的标题。
问题:我没有得到任何头衔;只是默认的“标题”值。
问题:我走对了吗?
如果是这样,我错过了什么?
或者...有其他选择吗?
【问题讨论】: