SwiftUI - iOS - 使用 scenePhase 会导致视图在应用程序进入后台并返回活动状态时弹出
SwiftUI - iOS - Using scenePhase causes views to pop when app going to background and back to active
我有一个项目,我正在尝试实施 scenePhase。实现的逻辑似乎工作正常,但我有以下奇怪的问题。
当 iOS(还有 Android)应用程序进入后台,然后再次点击时,预计会转到最后显示的屏幕。发生这种情况,但是当我声明(甚至不使用)环境变量“scenePhase”时,当我将我的应用程序置于后台然后再次激活它时,它会显示下一个声明屏幕。
让我用一些代码来说明一下(与我的应用程序相比进行了简化,但这里也存在行为):
第一个视图:
import SwiftUI
struct ContentView: View {
@State var actionState: Int? = 0
@Environment(\.scenePhase) private var scenePhase
var body: some View {
NavigationView{
NavigationLink(destination: View2(), tag: 1, selection: $actionState, label: {
Button(action: {
actionState = 1
}, label:{
Text("Hello, world! 1 ")
.padding()
})
})
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
第二个视图:
import SwiftUI
struct View2: View {
var body: some View {
NavigationLink(destination: View3()){
Text("Hello, world! 2 ")
.padding()
}
}
}
struct View2_Previews: PreviewProvider {
static var previews: some View {
View2()
}
}
第三个视图:
import SwiftUI
struct View3: View {
var body: some View {
Text("Hello, World! 3")
}
}
struct View3_Previews: PreviewProvider {
static var previews: some View {
View3()
}
}
如果我跟随点击,一直转到第三个视图,当我将应用程序置于后台然后再次转到前台时,它显示的不是第三个,而是第二个视图。
如果我删除此声明:@Environment(\.scenePhase) private var scenePhase
它(正确地)显示了第三个视图。
感谢任何帮助!!!
scenePhase
更改导致 body
被调用以重新计算 View
层次结构,您不能拥有超过一个细节 NavigationLink
,因此您需要设置第二个 isDetailLink(false)
.
顺便说一下,您不需要 NavigationLink
中的 Button
,因为它会呈现一个 suitable 可点击的东西,例如按钮或 table 行本身。
我有一个项目,我正在尝试实施 scenePhase。实现的逻辑似乎工作正常,但我有以下奇怪的问题。 当 iOS(还有 Android)应用程序进入后台,然后再次点击时,预计会转到最后显示的屏幕。发生这种情况,但是当我声明(甚至不使用)环境变量“scenePhase”时,当我将我的应用程序置于后台然后再次激活它时,它会显示下一个声明屏幕。 让我用一些代码来说明一下(与我的应用程序相比进行了简化,但这里也存在行为):
第一个视图:
import SwiftUI
struct ContentView: View {
@State var actionState: Int? = 0
@Environment(\.scenePhase) private var scenePhase
var body: some View {
NavigationView{
NavigationLink(destination: View2(), tag: 1, selection: $actionState, label: {
Button(action: {
actionState = 1
}, label:{
Text("Hello, world! 1 ")
.padding()
})
})
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
第二个视图:
import SwiftUI
struct View2: View {
var body: some View {
NavigationLink(destination: View3()){
Text("Hello, world! 2 ")
.padding()
}
}
}
struct View2_Previews: PreviewProvider {
static var previews: some View {
View2()
}
}
第三个视图:
import SwiftUI
struct View3: View {
var body: some View {
Text("Hello, World! 3")
}
}
struct View3_Previews: PreviewProvider {
static var previews: some View {
View3()
}
}
如果我跟随点击,一直转到第三个视图,当我将应用程序置于后台然后再次转到前台时,它显示的不是第三个,而是第二个视图。
如果我删除此声明:@Environment(\.scenePhase) private var scenePhase
它(正确地)显示了第三个视图。
感谢任何帮助!!!
scenePhase
更改导致 body
被调用以重新计算 View
层次结构,您不能拥有超过一个细节 NavigationLink
,因此您需要设置第二个 isDetailLink(false)
.
顺便说一下,您不需要 NavigationLink
中的 Button
,因为它会呈现一个 suitable 可点击的东西,例如按钮或 table 行本身。