当用户选择某些选项时,我想设置导航标题Picker
这是我的选择模型:
enum AppIcon: CaseIterable, Identifiable {
var id: Self {
return self
}
case `default`
case ethereum
case litecoin
var name: String {
switch self {
case .default:
return "Bitcoin"
case .ethereum:
return "Ethereum"
case .litecoin:
return "Litecoin"
}
}
}
这是我的观点
struct ContentView: View {
@State var icon: AppIcon = .default
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $icon, label: Text("Icon")) {
ForEach(AppIcon.allCases) { icon in
Text(icon.name).tag(icon)
}
}
}
}
.navigationBarTitle("Appearance")
}
}
}
我想得到这种行为:
但我试着把.navigationBarTitle("Title")
在任何右括号之后,它不起作用。
诀窍是通过 NavigationLink 创建一个新视图。
所以请向我们展示代码!
这是导航视图中带有表单的主视图。
struct ContentView: View {
@ObservedObject private var viewModel: ViewModel
init() {
self.viewModel = ViewModel()
}
var body: some View {
NavigationView {
Form {
PickerView(viewModel: viewModel)
}
.navigationTitle("Appearance")
}
}
}
我使用 ViewModel 来保存视图呈现的数据。我想没有可能做到这一点。
class ViewModel: ObservableObject {
@Published var icon: AppIcon = .default
}
在此结构中定义了实际的选择器。它是用列表来模拟的。
struct PickerView: View {
@ObservedObject private var viewModel: ViewModel
@State var presentSelectionView = false // for getting back to main menu
init(viewModel: ViewModel) {
self.viewModel = viewModel
}
var body: some View {
NavigationLink(isActive: $presentSelectionView) {
picker()
.navigationTitle("Title")
.navigationBarTitleDisplayMode(.large)
} label: {
HStack {
Text("Icon")
Spacer()
Text(viewModel.icon.name)
.foregroundColor(Color.gray)
}
}
}
private func picker() -> some View {
List {
ForEach(AppIcon.allCases, id: \.self) { icon in
HStack {
Text(icon.name)
Spacer()
if icon == viewModel.icon {
Image(systemName: "checkmark")
.foregroundColor(.accentColor) // or any other color
}
}
.contentShape(Rectangle()) // whole line is tappable
.onTapGesture {
self.viewModel.icon = icon
self.presentSelectionView = false
}
}
}
.listStyle(GroupedListStyle())
}
}
我使用了问题中给出的枚举。
最后看起来像这样:
我已经使用 XCode 13.1 和 iOS 15.2 完成了此操作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)