2017-09-15 85 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); 
     } 
    }