swift - 选择器行没有在表单中被取消选择(SwiftUI,Xcode 12 beta 4)

标签 swift swiftui xcode12

我正在 SwiftUI 的表单中创建一个选择器。在选择器中选择新元素时,当 View 拉回表单时,选择器行不会被取消选择。这是我的意思的屏幕截图,选择器行像这样保持灰色。 enter image description here
我读了一些以前的答案,说这是 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/

相关文章:

ios - 如何将导出/导入通用类型标识符图标添加到 Xcode 12 项目?

ios - iOS中是否有空字符串字段

ios - 如何在 SwiftUI 中访问安全区域大小?

swift - “找不到构建输入文件”Swift 4.2、Xcode 10.0

ios - 如何在 SwiftUI 中创建对象的实例而不重复?

ios - 动画 View 以在 SwiftUI 中向上滑动和隐藏

ios - SwiftUI 无法添加 onChange 事件

swift - CAShapeLayer shadowPath 动画。如何防止动画完成时的阴影填充?

ios - 使用 Swift 和 xCode9 beta4 创建静态库

ios - 模拟器和设备之间的 Storyboard布局不同