最后,现在有了Beta
5,我们可以以编程方式弹出到父视图。但是,在我的应用程序中,有几个地方视图都有一个“保存”按钮,该按钮可以结束几个步骤并返回到开始。在UIKit中,我使用popToRootViewController(),但是我一直无法找到在SwiftUI中执行相同操作的方法。
以下是我尝试实现的模式的简单示例。有任何想法吗?
import SwiftUI
struct DetailViewB: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
VStack {
Text("This is Detail View B.")
Button(action: { self.presentationMode.value.dismiss() } )
{ Text("Pop to Detail View A.") }
Button(action: { /* How to do equivalent to popToRootViewController() here?? */ } )
{ Text("Pop two levels to Master View.") }
}
}
}
struct DetailViewA: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
VStack {
Text("This is Detail View A.")
NavigationLink(destination: DetailViewB() )
{ Text("Push to Detail View B.") }
Button(action: { self.presentationMode.value.dismiss() } )
{ Text("Pop one level to Master.") }
}
}
}
struct MasterView: View {
var body: some View {
VStack {
Text("This is Master View.")
NavigationLink(destination: DetailViewA() )
{ Text("Push to Detail View A.") }
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
MasterView()
}
}
}
设置视图调节isDetailLink
到false
一个NavigationLink
关键是让弹出到根的工作。isDetailLink
是true
默认设置,并且适用于包含的View。例如,在iPad横向上,分割视图是分开的,并isDetailLink
确保目标视图将显示在右侧。因此,设置isDetailLink
为false
意味着目标视图将始终被推送到导航堆栈上。因此总是可以弹出。
连同设置isDetailLink
为false
on
NavigationLink
,将isActive
绑定传递到每个后续的目标视图。最后,当您要弹出到根视图时,将该值设置为false
,它将自动弹出所有内容:
import SwiftUI
struct ContentView: View {
@State var isActive : Bool = false
var body: some View {
NavigationView {
NavigationLink(
destination: ContentView2(rootIsActive: self.$isActive),
isActive: self.$isActive
) {
Text("Hello, World!")
}
.isDetailLink(false)
.navigationBarTitle("Root")
}
}
}
struct ContentView2: View {
@Binding var rootIsActive : Bool
var body: some View {
NavigationLink(destination: ContentView3(shouldPopToRootView: self.$rootIsActive)) {
Text("Hello, World #2!")
}
.isDetailLink(false)
.navigationBarTitle("Two")
}
}
struct ContentView3: View {
@Binding var shouldPopToRootView : Bool
var body: some View {
VStack {
Text("Hello, World #3!")
Button (action: { self.shouldPopToRootView = false } ){
Text("Pop to root")
}
}.navigationBarTitle("Three")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
最后,使用Beta 5,我们可以通过编程方式弹出到父视图。然而,在我的应用程序中有几个地方,视图有一个“保存”按钮,它结束了一个多步骤的过程并返回到开始。在UIKit中,我使用popToRootViewController(),但我无法在SwiftUI中找到同样的方法。 下面是我试图实现的模式的一个简单例子。 我该怎么做?
问题内容: 我正在尝试使用以下代码弹出到根视图控制器: 这通常可行,但是当当前视图是模式视图时,尝试使用此代码时出现错误。在这种情况下,我该如何跳回到根视图控制器? 提前致谢。 问题答案: 您可以检查当前控制器是否存在,如果存在,则将其关闭,然后直接转到当前控制器。
我对中的有一个问题。 下面是我的代码: 问题:在中按下时,会像它应该的那样消失,取而代之。但是,并不会消失,而是停留在视图B的顶部。 当更改为时,如何强制关闭?请注意,也可以由以外的其他视图更改,因此只将传递给并在单击时将其设置为false并不能完成此工作。
问题内容: 我找不到有关使用SwiftUI 以* 编程 方式 弹出 或 关闭 所显示视图的任何方式的任何参考。 * 在我看来,唯一的方法是对模式使用已经集成的幻灯片dow操作(以及是否/如何禁用此功能?),以及对导航堆栈使用后退按钮。 有人知道解决方案吗?您知道这是一个错误还是会一直保持这种状态? 问题答案: 本示例使用Beta 5版本说明中记录的新环境var,该环境使用了value属性。在更高的
问题内容: 我有一个SwiftUI视图,其中包含一个名为的EnvironmentObject 。然后,它读取其方法中的值。我希望这可以将我的视图绑定到该属性,以便在属性更新时重新呈现该属性,但这似乎没有发生。 这是一个错误吗?如果没有,将视图绑定到SwiftUI中环境对象的嵌套属性的惯用方式是什么? 具体来说,我的模型看起来像这样… 我的观点看起来像这样… 当我运行应用程序并单击标签时,属性会增加
我开始尝试,我感到惊讶的是,更改