【问题标题】:How to segue back to a UIViewController that's already loaded?如何切换回已经加载的 UIViewController?
【发布时间】:2012-04-17 17:09:34
【问题描述】:

我在情节提要上有一个视图,它有一个按钮来执行某个操作。但是,要执行此操作,用户必须登录。按钮处理程序测试用户是否已登录,如果是,则执行一个 segue,如果不是,则执行另一个 segue。 NO segues 推送到登录视图控制器。还有另一个 segue 连接回第一个视图控制器,所以如果登录成功,用户可以从他们离开的地方继续。视图控制器嵌入在导航控制器中。

问题是,'return' segue 正在加载视图控制器的全新实例,而不是引用原始实例,因此我最终在内存中得到了空的界面元素和该视图控制器的 2 个副本。

我怎样才能回到视图控制器的原始实例?

【问题讨论】:

    标签: objective-c ios storyboard segue


    【解决方案1】:

    假设您使用“push”意味着您正在使用UINavigationController,那么您可以使用以下内容返回堆栈顶部。

    [self.navigationController popToRootViewControllerAnimated:YES];
    

    UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>];
    [self.navigationController popToViewController:prevVC animated:YES];
    

    弹出到&lt;n&gt; 是该级别的特定级别。

    [self.navigationController popViewControllerAnimated:YES];
    

    如果您只想在导航堆栈中弹出一层备份。

    【讨论】:

    • 我有一个 UIBarButton,它最初在上一个屏幕(我们要返回的屏幕)的 ViewDidLoad 中加载。当我使用您的代码时, UIBar 根本不显示。知道为什么吗?
    【解决方案2】:

    您应该使用与 segue 关联的事件来代替关闭当前视图控制器(如果 segue 是模态的)或从导航控制器中弹出它(如果segue 是 push),之前的控制器会自动显示。

    例如,如果在您按下登录屏幕上的按钮时正在执行返回的模态转场,则您会从情节提要中删除转场,并在与您的操作链接的按钮的 touch up inside 事件中删除该转场,成功登录后会调用:

     [self dismissViewControllerAnimated:YES completion:nil];
    

    在情节提要上,您将右键单击按钮并将发送事件内的触摸向上拖动到视图控制器场景的第一响应者。这将执行执行 segue 转换时执行的反向转换。您可以为此使用模态转场,无需使用导航控制器。

    如果您将登录视图推送到导航控制器上,那么您必须将其从堆栈中弹出(如果返回到前一个视图)。使用其中之一:

        [[self navigationController] popViewControllerAnimated:YES];  // goes back to previous view
    [[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
    [[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack
    

    动画过渡应该与 segue 上使用的过渡类型相反,因此当您关闭视图时 curl up 会向下卷曲。

    【讨论】:

    • 如果您使用的是自定义 segue,例如推送 segue 的非滑动效果,pop 将不会与您的自定义 segue 相反,而只是滑动效果。
    【解决方案3】:

    如果您使用转场前进,那么您应该使用展开转场返回。关于如何使用 unwind segue 的详细信息在 Technical Note TN2298 Using Unwind Segues 中。

    【讨论】:

      【解决方案4】:

      malhal 是对的 - 值得点击他的链接。

      代码似乎与 Apple 的示例有所不同,并且更加灵活。我有三个场景,但只有一个自定义 ViewController .m 文件。我不想要导航堆栈。对后续场景的访问是通过按钮进行的​​。我在基本视图控制器 .m 文件中添加了这一行:

      - (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}
      

      然后在第三个场景中,我从一个按钮控制拖动到退出图标并选择了展开动作。它现在从场景 3 退回到场景 2,而无需调用 dismissViewController 方法。

      【讨论】:

      • 我认为我最终理解的关键是它会展开你的堆栈,直到它到达一个控制器,该控制器实现与你正在使用的特定退出 segue 关联的 unwindAction。因此,您可以使用不同的展开操作定义多个退出转场,然后在要着陆的控制器中为每个转场实现特定的展开操作。
      猜你喜欢
      • 2014-03-29
      • 1970-01-01
      • 2013-04-21
      • 2015-09-22
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      相关资源
      最近更新 更多