Xamarin的iOS,在弹出的后退按钮多个视图控制器点击

问题描述:

如果你有四个视图控制器Xamarin的iOS,在弹出的后退按钮多个视图控制器点击

A B C D

而在A.在视图控制器A,B和C盘根导航控制器点,有一个按钮可将您导航至右侧。使得应用程序的流量

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

有没有一种方法,使得视图控制器D上的后退按钮即可弹出2个视图控制器,带我回视图控制器B

我不知道Xamarine的一部分,但对于本机iOS应用程序,有UINavigationController方法popToViewController(_:animated:),它会从堆栈中弹出任意数量的视图控制器以公开指定的视图控制器。 (这是Swift签名Objective-C方法签名是popToViewController:animated:。)

我假设有一种方法可以从Xamarin获得该方法吗?

+0

谢谢你,如何与本地iOS应用程序中使用此方法:按照d视图控制器上的后退按钮处理程序代码

写?你有没有一个例子 – Zac

+0

我没有任何代码方便,但它非常简单。我建议在Apple文档中查找该方法。您只是将该方法发送给导航控制器,并将目标视图控制器作为参数放在最前面。 –

+0

什么可能适合调用PopToViewController方法?我目前正在尝试WillMoveToParentController,但该方法不起作用 – Zac

尽管这可能不是理想的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 
} 

是的,你可以做到这一点。

从堆栈中找出您想要弹出的视图控制器。然后使用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