7

我正在 SwiftUI 中的表单中创建一个选择器。在选择器中选择新元素时,当视图拉回表单时,选择器行不会被取消选择。这是我的意思的屏幕截图,选择器行像这样保持灰色。在此处输入图像描述

我阅读了一些先前的答案,这些答案说这是 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()
    }
}

问题仍然存在。

4

1 回答 1

4

(据记录,我在 Big Sur,Xcode 12.2 上,这个问题仍然存在。)

经过几次测试,这种行为似乎是由于同一视图中的多个列表造成的。您可以看到,当导航堆栈弹出回视图时,第一个“列表”(即 UITableView)将取消选择其选定的行,但这不适用于第一个列表之后的列表。很明显这是一个错误(在 SwiftUI 中?!)。

我发现绕过这个错误的唯一方法(并且某种程度上是一种糟糕的方法)是让Introspect 库获取感兴趣的 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)
          }

        }
}

它有效......但没有动画(任何人?)。

于 2020-12-14T10:31:07.973 回答