【问题标题】:Pop to specific view controller after pushing and presenting few UIViewController推送并呈现几个 UIViewController 后弹出到特定的视图控制器
【发布时间】:2019-09-03 18:42:07
【问题描述】:

我正在制作应用程序,在这种情况下,用户可以推送很少的控制器,也可以提供很少的控制器。但是在最后的特定操作之后,我想从用户开始的地方弹出到那个控制器。

例如, 从 VC1 用户推送到 VC2,再次推送到 VC3。现在,用户呈现给 VC4,然后再次呈现给 VC5。现在,我想从 VC5 弹出到 VC1。 这是例如。在这之间,用户可以推送和展示控制器的数量。

我已经尝试过以下方法:

 1. [self.navigationController popViewControllerAnimated:NO];
 2. [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
 3. [self.view.window.rootViewController dismissViewControllerAnimated:YES completion:nil];

但这种方式对我没有帮助。请向我推荐更好的解决方案。

【问题讨论】:

  • 你试过了吗-> popToRootViewControllerAnimated:
  • @Garry :感谢您的回复,但我不需要导航到 root。在我上面的例子中,VC1 不是根视图控制器。

标签: ios objective-c uiviewcontroller navigation


【解决方案1】:

您可以访问在 NavigationController 上推送的 ViewController 数组。

NSArray *arrayViewControllers = [self.navigationController viewControllers];

/* Content of Array will be @[VC1,VC2,VC3,VC4,VC5.....]
   Now Alter the Array by converting it to Mutable some what like this
   @[VC1,VC2,VC5]
*/

然后将新数组分配给 navigationController 的 viewControllers 属性。

[self.navigationController viewControllers] = //New Altered Array.

如果有帮助,请告诉我。

Rgds, 阿米特

【讨论】:

  • 感谢您的回复。如果我选择你建议的答案。它会从内存中删除其他控制器吗?虽然我一定会试试这个。
  • 是的 .. 如果你想要内存中的视图控制器,只需按照你的意愿随机排列顺序...... :-)
  • 不,在弹出到特定的视图控制器后,我不希望控制器之间的那个留在内存中。所以,我很担心。
  • 好的..然后你可以继续从Array中删除VC,但我担心[self.navigationController viewControllers]不会给出呈现而不是推送的viewControllers。
【解决方案2】:

另一种可能更安全的方法:

   for (UIViewController *controller in  self.navigationController.viewControllers) 

   {

         //Do not forget to import YourViewController.h

        if ([controller isKindOfClass:[YourViewController class]]) { 

            [self.navigationController popToViewController:controller
                                                  animated:YES];
            break;
        }
    }

【讨论】:

  • 这对我不起作用。我认为它只适用于所有推送的视图控制器。
【解决方案3】:

只需使用此代码...

for (UIViewController *controller in self.navigationController.viewControllers)
{
    if ([controller isKindOfClass:[VC1 class]])
    {


        [self.navigationController popToViewController:controller
                                              animated:YES];
        break;
    }
}

【讨论】:

  • 这对我不起作用。我认为它只适用于所有推送的视图控制器。
  • @MehulS 不,它正在工作 ..if ([controller isKindOfClass:[VC1 class]]) 获取您的课程时,此条件为真 ....然后导航到您的视图控制器...否则循环运行..
【解决方案4】:

试试这个

[self.nav dismissViewControllerAnimated:YES completion:^{

for (UIViewController *controller in self.navigationController.viewControllers)
{
    if ([controller isKindOfClass:[VC1 class]])
    {

        [self.navigationController popToViewController:controller
                                              animated:YES];
        break;
    }
}

}
];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2014-10-03
    • 2019-03-28
    • 1970-01-01
    • 2012-08-17
    • 2011-01-15
    相关资源
    最近更新 更多