我正在 SwiftUI 的表单中创建一个选择器。在选择器中选择新元素时,当 View 拉回表单时,选择器行不会被取消选择。这是我的意思的屏幕截图,选择器行像这样保持灰色。
我读了一些以前的答案,说这是 Xcode 11.3 中的一个错误,但是,我正在运行 Xcode 12 beta 4 并且不确定这是否仍然是一个错误。
这就是我创建选择器的方式:
struct SettingsView: View {
@State private var currentSelection = 1
var body: some View {
NavigationView {
Form {
Section {
Picker("Test 2", selection: $currentSelection) {
ForEach(1 ...< 100) { i in
Text(String(i)).tag(i)
}
}
}
}
}
}
}
这是我的 ContentView,我从中展示了 SettingsView:enum ActiveSheet: Identifiable {
case photoPicker, settings
var id: Int {
self.hashValue
}
}
struct ContentView: View {
@State var activeSheet: ActiveSheet?
var body: some View {
NavigationView {
VStack {
Text("Hello world")
Button("Select Photo") {
self.activeSheet = .photoPicker
}
}
.navigationBarTitle(Text("Title"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
self.activeSheet = .settings
}, label: {
Image(systemName: "gear")
.imageScale(.large)
}))
}
.sheet(item: $activeSheet) { item in
if item == .photoPicker {
ImagePicker(selectedImage: $image, sourceType: .photoLibrary)
} else {
SettingsView()
}
}
}
}
编辑:我创建了一个全新的项目,这是唯一的代码:import SwiftUI
struct ContentView: View {
@State private var currentSelection = 0
var body: some View {
NavigationView {
Form {
Section {
Picker("Test Picker", selection: $currentSelection) {
ForEach(0 ..< 100) { i in
Text(String(i)).tag(i)
}
}
}
}.navigationBarTitle(Text("Test"))
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
问题仍然存在。
最佳答案
(为了记录,我在 Big Sur,Xcode 12.2 上,这个问题仍然存在。)
经过几次测试后,这种行为似乎是由于同一 View 中的多个列表造成的。您可以看到,当导航堆栈弹出回 View 时,第一个“列表”(即 UITableView)会取消选择其选定的行,但这不适用于第一个列表之后的列表。很明显这是一个错误(在 SwiftUI 中?!)。
我发现绕过这个错误的唯一方法(不知何故是一种蹩脚的方法)是拥有 Introspect Library获取感兴趣的 tableView(在本例中是显示 Form 的 tableView)并像这样做一些内务处理:
import Introspect
...
public class Weak<T: AnyObject> {
public weak var value: T?
public init(_ value: T? = nil) {
self.value = value
}
}
private var listTableView = Weak<UITableView>()
var body: Some View {
NavigationView {
VStack {
List {
...
}
Form {
Picker(...) {
...
}
}
.introspectTableView { listTableView.value = $0 }
.onAppear() {
if let tableView = listTableView.value, let indexPath = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: indexPath, animated: true)
}
}
}
它有效......但没有动画(任何人?)。
关于swift - 选择器行没有在表单中被取消选择(SwiftUI,Xcode 12 beta 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63314913/