2017-02-28 60 views
1

如果你有四個視圖控制器Xamarin的iOS,在彈出的後退按鈕多個視圖控制器點擊

A B C D

而在A.在視圖控制器A,B和C盤根導航控制器點,有一個按鈕可將您導航至右側。使得應用程序的流量

root -> A -> B -> C -> D

有沒有一種方法,使得視圖控制器D上的後退按鈕即可彈出2個視圖控制器,帶我回視圖控制器B

回答

0

我不知道Xamarine的一部分,但對於本機iOS應用程序,有UINavigationController方法popToViewController(_:animated:),它會從堆棧中彈出任意數量的視圖控制器以公開指定的視圖控制器。 (這是Swift簽名Objective-C方法簽名是popToViewController:animated:。)

我假設有一種方法可以從Xamarin獲得該方法嗎?

+0

謝謝你,如何與本地iOS應用程序中使用此方法:按照d視圖控制器上的後退按鈕處理程序代碼

寫?你有沒有一個例子 – Zac

+0

我沒有任何代碼方便,但它非常簡單。我建議在Apple文檔中查找該方法。您只是將該方法發送給導航控制器,並將目標視圖控制器作爲參數放在最前面。 –

+0

什麼可能適合調用PopToViewController方法?我目前正在嘗試WillMoveToParentController,但該方法不起作用 – Zac

0

儘管這可能不是理想的UI流程(當展開視圖控制器B時,您會看到視圖控制器3),但我已將其獲取到工作。爲了達到這個目的,你必須在故事板文件中命名你的segues(你必須設置每個標識符)。

如果您進一步創建此鏈,則可以彈出2個以上的視圖控制器。使用這種方法唯一的警告是ui過渡..希望這可以幫助其他人!


視圖控制器B

public partial BViewController : UIViewController 
{ 
    public BViewController(IntPtr handle) : base(handle) 
    { } 

    public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) 
    { 
     base.PrepareForSegue(segue, sender); 

     // Add to view controller stack; 
     // segue Identifier (in storyboard) must match string comparison below 
     if (segue.Identifier == "ToViewControllerCSegue") 
     { 
      var cViewController = segue.DestinationViewController as CViewController; 

      if (bViewController != null) 
      { 
       cViewController.ViewControllerStack = new List<UIViewController>(); 
       cViewController.ViewControllerStack.Add(this);     
      } 
     } 
    } 

    // Other methods you want to have 
} 

視圖控制器C

public partial CViewController : UIViewController 
{ 
    public CViewController(IntPtr handle) : base(handle) 
    { } 

    public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) 
    { 
     base.PrepareForSegue(segue, sender); 

     // Add to view controller stack; 
     // segue Identifier (in storyboard) must match string comparison below 
     if (segue.Identifier == "ToViewControllerDSegue") 
     { 
      var dViewController = segue.DestinationViewController as DViewController; 

      if (dViewController != null) 
      { 
       ViewControllerStack.Add(this); 
       dViewController.ViewControllerStack = ViewControllerStack; 
      } 
     } 
    } 

    public List<UIViewController> ViewControllerStack { get; set; } 

    // Other methods you want to have 
} 

視圖控制器d

public partial DViewController : UIViewController 
{ 
    public DViewController(IntPtr handle) : base(handle) 
    { } 

    public override void DidMoveToParentViewController(UIViewController parent) 
    { 
     base.DidMoveToParentViewController(parent); 

     // parent will be null when clicking the back button 
     if (parent == null) 
     {     
      // Pops back to view controller b; 
      // you could pop back further if you had more 
      // viewcontrollers in the List<> 
      ViewControllerStack[ViewControllerStack.Count - 1].NavigationController.PopToViewController(ViewControllerStack[0], true); 

      // Refreshes view 
      ReloadInputViews(); 
     } 
    } 

    public List<UIViewController> ViewControllerStack { get; set; } 

    // Other methods you want to have 
} 
2

是的,你可以做到這一點。

從堆棧中找出您想要彈出的視圖控制器。然後使用PopToViewController彈出回該視圖控制器。

this.NavigationItem.SetLeftBarButtonItem (new UIBarButtonItem(
UIImage.FromFile("back.png"), UIBarButtonItemStyle.Plain, (sender, args) => { 
    var vwControllers = this.NavigationController.ViewControllers; 
      foreach(UIViewController vc in vwControllers) { 
       if (vc.GetType() == typeof (B)) { 
        this.NavigationController.PopToViewController (vc); 
       } 
}), true); 
+0

嗨忍者,這是否需要我添加一個視圖控制器的列表,就像我在我的例子中寫的?而且,這是如何添加到後退按鈕事件處理程序? – Zac

+0

@Zac不,你不需要添加視圖控制器列表。只需將此添加到後退按鈕事件。 – Darshana

相關問題