【发布时间】:2020-03-08 17:39:27
【问题描述】:
我正在处理一个 SwiftUI 项目,但无法让选择器正常工作。
我将视图层次结构拆分为多个文件,初始视图将所有内容包装在 NavigationView 中。
看起来像这样:
MainFile (TabView -> NavigationView)
- ListPage (NavigationLink)
-- DetailHostPage (Group.EditButton)
if editing
--- DetailViewPage
else
--- DetailEditPage (picker in a form)
DetailEditPage 中的选择器不允许我更改它的值,尽管它确实显示了正确的当前值。
Picker(selection: self.$_myObj.SelectedEnum, label: Text("Type")) {
ForEach(MyEnum.allCases, id: \.self) {
Text("\(String(describing: $0))")
}
}
如果我直接将选择器包装在导航视图中,那么它可以工作,但现在我有一个嵌套导航视图,导致两个后退按钮,这不是我想要的。
是什么导致选择器不允许其选择改变,我怎样才能让它工作?
编辑
这是一个如何复制的示例:
ContentView.swift
class MyObject: ObservableObject {
@Published var enumValue: MyEnum
init(enumValue: MyEnum) {
self.enumValue = enumValue
}
}
enum MyEnum: CaseIterable {
case a, b, c, d
}
struct ContentView: View {
@State private var objectList = [MyObject(enumValue: .a), MyObject(enumValue: .b)]
var body: some View {
NavigationView {
List {
ForEach(0..<objectList.count) { index in
NavigationLink(destination: Subview(myObject: self.$objectList[index])) {
Text("Object \(String(index))")
}
}
}
}
}
}
struct Subview: View {
@Environment(\.editMode) var mode
@Binding var myObject: MyObject
var body: some View {
HStack {
if mode?.wrappedValue == .inactive {
//The picker in this view shows
SubViewShow(myObject: self.$myObject)
} else {
//The picker in this view does not
SubViewEdit(myObject: self.$myObject)
}
}.navigationBarItems(trailing: EditButton())
}
}
struct SubViewShow: View {
@Binding var myObject: MyObject
var body: some View {
Form {
Picker(selection: self.$myObject.enumValue, label: Text("enum values viewing")) {
ForEach(MyEnum.allCases, id: \.self) {
Text("\(String(describing: $0))")
}
}
}
}
}
struct SubViewEdit: View {
@Binding var myObject: MyObject
var body: some View {
Form {
Picker(selection: self.$myObject.enumValue, label: Text("enum values editing")) {
ForEach(MyEnum.allCases, id: \.self) {
Text("\(String(describing: $0))")
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
【问题讨论】:
-
我试图毫无困难地模仿相同的层次结构......向我们展示你的模型和枚举。你在哪里嵌套导航视图?从提供的信息来看,有任何
-
@user3441734 我接受了您的回答并对其进行了修改,以说明我是如何解决问题的。我不确定它是否与 EditButton 和 Group 有关,因为这些是我的设置和你的设置之间的主要区别。
-
发现如果我使用 EditButton() 显示细节或编辑子视图,细节子视图选择器工作正常,但编辑视图选择器不行。
-
我现在明白了,你在说什么。你喜欢在那里编辑什么?选择器被禁用,只是因为它不可编辑。你对那里有什么期望?
-
change (add) .pickerStyle(SegmentedPickerStyle()) 你会看到,选择器工作,只是在编辑模式下,你不能改变视图层次结构。这是标准行为,不是吗?
标签: swift swiftui swiftui-picker