最后,现在有了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 …Run Code Online (Sandbox Code Playgroud) 我想运行帐户创建逻辑,然后,如果成功,转换到目标视图。否则,我将提供错误表。NavigationLink 会立即转换到目标视图。
如果我使用 isActive 重载和空字符串作为文本(它创建一个具有零帧的视图)创建一个幻影 NavigationLink,我可以让它工作。然后,我使用显示给用户的按钮切换 isActive 属性,该按钮首先运行帐户创建逻辑,并在链的末尾将 NavigationLink 切换为活动状态。我在一个 NavigationView 里面。
@State private var isActive: Bool = false
NavigationView {
// Name, Email, Password Textfields here
// Button to run account creation logic:
Button(action: {
// Account creation promise chain here, then...
self.isActive.toggle()
}) {
Text("Create Account")
}
// Phantom navigation link:
NavigationLink("", destination: VerifyEmailView(email: email), isActive: self.$isActive)
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?从按钮触发运行帐户创建逻辑,然后激活虚拟导航链接以转换到下一个屏幕似乎是不好的做法。
在SwiftUI我们使用NavigationView和NavigationLink意见进行导航(我们习惯称之为segue中UIKit)。UIKit中的标准segue是showsegue。在SwiftUI中,我们可以简单地执行以下操作:
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: Text("Destination")) {
Text("Navigate!")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
具有完全相同的效果(即使单词segue消失了)。
有时(实际上是经常),我们需要自定义segue动画。
Animates通过单击动画来在属性检查器中找到该属性(true / false)。这样,目标视图控制器将立即代替源视图控制器出现。UIViewControllerAnimatedTransitioning协议的对象来完成的。所有的魔术都发生在animateTransition使我们能够访问源视图控制器和目标视图控制器的方法中。例如,一个简单的淡入淡出segue动画可能类似于:
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
UIView* containerView = [transitionContext containerView];
UIViewController* fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController* toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
toVC.view.alpha = 0;
[containerView addSubview:toVC.view];
[UIView animateWithDuration:1 animations:^{
toVC.view.alpha = 1;
fromVC.view.alpha = 0;
} completion:^(BOOL …Run Code Online (Sandbox Code Playgroud)