关于 SwiftUI 屏幕旋转和 NavigationView 的一个小疑问

2021-02-07 17:48:39 +08:00
 shoujiaxin

初学 SwiftUI,遇到点小问题,想请教一下大家。我有这样几个 View:

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: ListView()) {
                Text("To ListView")
            }
        }
    }
}

struct ListView: View {
    var body: some View {
        NavigationLink(destination: DetailView()) {
            Text("To DetailView")
        }
    }
}

struct DetailView: View {
    var body: some View {
        Text("DetailView")
    }
}

现在情况是在 iPhone 上,如果在 DetailView 中从 Portrait 转换到 Landscape,就会自动回到 ListView,如果先横屏再进入 DetailView,之后怎么旋转也不会回去。

搜了一下发现给 NavigationView 设置 StackNavigationViewStyle 就不会出现这种情况了,但是如果我想在默认或者两栏样式的 NavigationView 上旋转屏幕而不自动返回 ListView 该怎么做呢?

1821 次点击
所在节点    iDev
2 条回复
95276
2021-02-08 00:44:53 +08:00
首先建议你在 iPhone 上使用 StackNavigationViewStyle

其次下面的代码应该能达到你想要的效果,但不建议使用
```swift
import SwiftUI

struct ContentView: View {
var body: some View {
VStack {
NavigationView {
NavigationLink(destination: ListView()) {
Text("To ListView")
}
}
}
}
}

struct ListView: View {
@State var tap = false
@State var active = false
var body: some View {
NavigationLink(destination: DetailaView(tap: $tap), isActive: $active) {
Text("To DetailView")
.onTapGesture {
active = true
tap = true
}
}
.onAppear {
active = tap
}
}
}

struct DetailaView: View {
@Binding var tap: Bool
var body: some View {
Text("DetailView")
.onDisappear {
tap = false
}
}
}
```
shoujiaxin
2021-02-08 09:12:05 +08:00
@95276 学习了,感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX