SwiftUI 2 中的选择器 .onChange() 不会更改 UINavigationBar.appearance()

Picker in SwiftUI 2 .onChange() does not change UINavigationBar.appearance()

所以这是一个奇怪的...在 SwiftUI 2 发布之前,我在视图的 init() 中设置 UINavigationBar.appearance() 如下:

init(selectedStyle: Binding<Int>) {
        _selectedStyle = selectedStyle
        if self.selectedStyle == 1 {
            UINavigationBar.appearance().backgroundColor = UIColor.init(displayP3Red: 7/255, green: 7/255, blue: 7/255, alpha: 1)
            UISegmentedControl.appearance().backgroundColor = .black
            UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
            UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: UIControl.State.selected)
            UISegmentedControl.appearance().selectedSegmentTintColor = .white
            UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: UIControl.State.normal)
        } else {
            UINavigationBar.appearance().backgroundColor = .white
            UISegmentedControl.appearance().backgroundColor = .white
            UISegmentedControl.appearance().selectedSegmentTintColor = .white
            UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black]
            UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: UIControl.State.selected)
            UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: UIControl.State.normal)
        }
    }

在 SwiftUI 1 中,视图将再次初始化,因此导航栏的新外观将正确更新。因为 init() 函数会再次 运行 。我试图将相同的代码放在附加到 Picker 的 onChange() 中,但由于某种原因它不起作用:

Picker(selection: $selectedStyle, label: Text("")) {
    ForEach(0 ..< 3) {
        Text([[=12=]])
    }
}
.pickerStyle(SegmentedPickerStyle())
.onChange(of: selectedStyle, perform: { change in
    if self.selectedStyle == 1 {
            UINavigationBar.appearance().backgroundColor = UIColor.init(displayP3Red: 7/255, green: 7/255, blue: 7/255, alpha: 1)
            UISegmentedControl.appearance().backgroundColor = .black
            UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
            UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: UIControl.State.selected)
            UISegmentedControl.appearance().selectedSegmentTintColor = .white
            UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: UIControl.State.normal)
        } else {
            UINavigationBar.appearance().backgroundColor = .white
            UISegmentedControl.appearance().backgroundColor = .white
            UISegmentedControl.appearance().selectedSegmentTintColor = .white
            UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black]
            UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: UIControl.State.selected)
            UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: UIControl.State.normal)
        }
    })

appearance 对 UI 元素产生影响 设置相应的外观后创建。所以你需要重新创建所有依赖 UI.

可能的方法如下 - 假设您在 ContentView 的根目录中有 NavigationView,您可以通过

重新创建它(以及所有子视图)
var body: some View {
   NavigationView {

     // .. content here

   }.id(selectedStyle)       // << here !!
}