为什么 SwiftUI 选择器在导航后重新定位表单?

Kor*_*tor 21 forms picker ios swiftui

单击选择器后,它将导航到选择视图。项目列表渲染得离顶部太远,但在动画完成后会捕捉到。为什么会这样?

演示:https : //gfycat.com/idioticdizzyazurevase

我已经创建了一个最小示例来排除导航栏标题和按钮、表单部分和其他细节:

import SwiftUI

struct NewProjectView: View {

    @State var name = ""

    var body: some View {
        NavigationView {
            Form {
                Picker("Client", selection: $name) {
                    Text("Client 1")
                    Text("Client 2")
                }
            }
        }
    }
}

struct NewProjectView_Previews: PreviewProvider {
    static var previews: some View {
        NewProjectView()
    }
}
Run Code Online (Sandbox Code Playgroud)

这发生在预览模式、模拟器和设备上(Xcode 11.2、模拟器中的 iOS 13.2、设备上的 13.3 beta 1)。

Kor*_*tor 10

强制导航视图样式堆叠时,可以解决明显错误的行为:

NavigationView {
    …
}.navigationViewStyle(StackNavigationViewStyle())
Run Code Online (Sandbox Code Playgroud)

这是我的问题的解决方案,但我不会将此标记为已接受的答案(还)。

  1. 这似乎是一个错误,即使它可能是由特殊情况触发的。
  2. 如果您需要另一种导航视图样式,我的解决方案将不起作用。
  3. 此外,它不会修复 DogCoffee 在评论中提到的水平重新定位。


np2*_*314 5

在我看来,它与导航栏有关。默认情况下(未提及.navigationBarTitle扩展名),导航显示模式设置为.automatic,应修改为.inline。我遇到了另一篇与此类似的帖子,并使用他们的解决方案与您的解决方案相结合,使用.navigationBarTitle("", displayMode: .inline)应该会有所帮助。

import SwiftUI

struct NewProjectView: View {

    @State var name = ""

    var body: some View {
        NavigationView {
            Form {
                Picker("Client", selection: $name) {
                    Text("Client 1")
                    Text("Client 2")
                }
            }
            .navigationBarTitle("", displayMode: .inline)
        }
    }
}


struct NewProjectView_Previews: PreviewProvider {
    static var previews: some View {
        NewProjectView()
    }
}
Run Code Online (Sandbox Code Playgroud)