【问题标题】:Delegate / Unwind Segue at NavigationController Back Button在 NavigationController 后退按钮处委托/展开 Segue
【发布时间】:2019-11-02 01:10:30
【问题描述】:

我有一个具有三个视图的应用:

  • 第一视图
  • 第二视图
  • 第三视图

当我在 ThirdView 上并单击导航控制器的后退按钮时,我想将数据从 ThridView 传递到 SecondView。 但我不知道该怎么做。

我不想在视图上添加额外的按钮。

当我在 SecondView 上并且我想回到 FirstView 时也是如此。 我无法使用“ViewWillDisappear”方法,因为如果在此方法上设置“PerformSegueWithIdentifier”以将数据从 SecondView 传递到 FirstView,我无法切换到 ThirdView,因为将执行“ViewWillDisappear”方法。

你能帮帮我吗?

PS:我用的是swift 2语言

【问题讨论】:

  • 我想出的唯一方法是隐藏后退按钮并放置一个由您创建的栏项。

标签: ios xcode swift


【解决方案1】:

在您的viewWillDisappearviewDidDisappear 方法中,您可以通过检查您的视图控制器是否从父视图控制器移动来检查是否按下了后退按钮。

override func viewWillDisappear(animated: Bool) {

    if(self.isMovingFromParentViewController())
    {
        //Send data to previous view controller
        print("Going back: Back button pressed");
    }else{
        print("Controller is hidden due to some other reason e.g Pushing another view controller");
    }
}

【讨论】:

    【解决方案2】:

    我创建了 UINavigationController 的子类,因为自 Xcode 11 以来我在 UIViewController 中找不到 Unwind Segue 签名。

    @implementation CLUnwindNavigationController
    
    - (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender {
        return NO;
    }
    
    - (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC {
    }
    
    @end
    

    您可以找到 UnwindSegue 签名。

    您可以连接到您想要的操作。

    【讨论】: