2017-09-15 82 views
0

当用户验证正确时,它将被引导至HomeViewModel。我想删除它可以返回到登录屏幕的可能性,因此我创建了一个定制展示器以删除新屏幕下方的所有屏幕。Xamarin IOS如何清除堆栈?

的实现方式如下:

public class CustomPresenter: MvxFormsIosPagePresenter 
    { 
     public CustomPresenter(UIWindow window, MvxFormsApplication mvxFormsApp) 
     : base(window, mvxFormsApp) 
     { 
     } 

     public override void Show(MvxViewModelRequest request) 
     { 

      if (request.PresentationValues?["NavigationCommand"] == "StackClear") 
      { 
       var navigation = FormsApplication.MainPage.Navigation; 
       Debug.WriteLine("Navigation Back Stack Count -> " + navigation.NavigationStack.Count()); 
       navigation.PopToRootAsync(); 
       Debug.WriteLine("Navigation Back Stack Count After PopToRootAsync -> " + navigation.NavigationStack.Count()); 
       return; 
      } 

      base.Show(request); 
     } 
    } 

在认证过程中正确地完成,我浏览到主屏幕通过将一束用这个特殊的命令:

LoginWithFacebookCommand.Subscribe(token => { 
       Debug.WriteLine("JWT Token -> " + token); 
       _userDialogs.ShowSuccess(AppResources.Login_Success); 
       var mvxBundle = new MvxBundle(new Dictionary<string, string> { { "NavigationCommand", "StackClear" } }); 
       ShowViewModel<HomeViewModel>(presentationBundle: mvxBundle); 
      }); 

的问题是,它不会改变屏幕,它停留在当前的屏幕上。什么才能正确地做到这一点?

我使用MvvmCross 5.1.1MvvmCross.Forms 5.1.1

非常感谢你提前。

+1

或者,你可以启动你的主屏幕,检查用户进行身份验证,并推模式与你的登录表单,如果他们需要登录。我已经使用像Prism这样的Mvvm框架,这使得操纵导航栈变得很容易,但我不确定它在MvvmCross中有多简单。 – Joe

回答

0

试试这个:

navigation.SetViewControllers(new UIViewController[] { vc }, true); 

VC是要设置为导航堆栈的根视图控制器。您将需要获取对它的引用,您可以使用NavigationController上的ViewControllers属性。

true - 表示您想要动画。

+0

感谢您的回复。 FormsApplication.MainPage.Navigation没有这个方法。你能解释一下我如何在我的例子中应用它? –

+0

@ SergioSanchezSanchez,pnavk的解决方案用于Presenter中并引用UIKit包。 UIKit.UINavigationController.SetViewControllers。我用Xamarin而不是Xamarin Forms使用MvvmCross,所以我不知道这是否也适用于Forms。 –

+0

@SergioSánchezSánchez对不起,刚刚阅读,你也使用MvvmCross :)。我也在寻找一个解决方案,并尝试pnavk的解决方案(忙于调试,因为我键入:P)。如果我来对了,我会发布更详细的答案。 –

1

据我所知,PopToRootAsync()将所有东西从堆栈中弹出。这意味着您应该在您调用此方法之后将您的视图推送到您的堆栈,即之后使用PushViewController(yourViewController)。另外,您应该使用MvvmCross的新IMvxNavigationService。你可以试试这个:

var navigationService = Mvx.Resolve<IMvxNavigationService>(); 

LoginWithFacebookCommand.Subscribe(async (token) => { 
       Debug.WriteLine("JWT Token -> " + token); 

       _userDialogs.ShowSuccess(AppResources.Login_Success); 

       await navigationService.Navigate<HomeViewModel>(); 
      }); 

要清除你基本上需要重写在主持人的显示方法,并检查您的视图模型是否被调用返回堆栈。如果它然后设置一个新的viewControllers数组。 (感谢@pnavk!

public class CustomPresenter : MvxIosViewPresenter 
    { 
     public override void Show(IMvxIosView view, MvxViewModelRequest request) 
     { 
      if (MasterNavigationController != null && view.ViewModel.GetType() == typeof(HomeViewModel)) 
      { 
       var viewController = view as UIViewController; 
       MasterNavigationController.SetViewControllers(new UIViewController[] { viewController }, true); 
      } 
      else 
       base.Show(view, request); 
     } 
    }