如何识别目标视图控制器上的 segue 标识符?

How to identify the segue identifier on destination view controller?

我有两个视图控制器,第一个有两个按钮,注册和登录,第二个 VC 做注册和登录的功能(我写了在注册和登录模式之间切换的功能),是否可以识别用户是否在第一个 VC 中按下 login/signup 按钮,以便在执行 segue 时在第二个 VC 中调用正确的函数?

您已经告诉第二个视图控制器根据第一个视图控制器选择的选项(登录或注册)做什么。我假设您可以通过简单地声明一个标志并将其发送到第二个视图控制器来做到这一点,例如:

在你的第二个视图控制器中声明一个布尔变量(比方说shouldBehavesAsLogin)这意味着如果选择是登录它应该是true:

// Controller that could represents signin or signup:
class SecondViewController: UIViewController {
    //...

    var shouldBehavesAsLogin = false

    // ...
}

因此您可以根据第一个视图控制器点击的按钮来确定应该分配给它的值是什么:

class FirstViewController: UIViewController {
    // ...

    private var isLoginTapped = false
    @IBAction func signinTapped(sender: UIButton) {
        isLoginTapped = true
    }

    @IBAction func signupTapped(sender: UIButton) {
        // nothing to do here, isLoginTapped is false by default...
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "MySegue"{
            if let nextViewController = segue.destination as? SecondViewController {
                nextViewController.shouldBehavesAsLogin = isLoginTapped
            }
        }
    }

    // ...
}

因此您所要做的就是检查 shouldBehavesAsLogin 的值是 true 让控制器表现为登录还是 false 做相反的事情。


附加提示:

如果为每个按钮添加 IBActions 的目的只是导航到第二个视图控制器,我建议让两个按钮具有相同的 IBAction,但你应该让 sender类型 UIButton 而不是 Any,因此你可以这样做 - 例如 -:

@IBAction func aButtonTapped(sender: UIButton) {
    // do the default behvior for both signin and signup (navigate to the second controller)

    // signinButton is the button you tap for navigating to second controller to behaves as signin
    isLoginTapped = sender === signinButton ? true : false
}

这个答案假设两个视图控制器之间只有一个 segue。如果不止一个,你可以简单地使用 prepareForSegue.

中的 segue 标识符

我会通过在 -prepare(for segue:sender:)-performSegue(withIdentifier:sender) 上使用 sender 参数来处理此问题,具体取决于您是直接从按钮还是在代码中触发 segue。

如果按钮触发了 segue,您可以测试 sender 参数是否是相关的两个按钮之一,并在目标 VC 上执行适当的设置。如果 segue 在 IBAction 方法的代码中被触发,您可以通过 IBActions sender 参数的按钮引用,或者传递您的 prepareForSegue方法是可以处理的。

请记住,调用 prepareForSegue 时不会加载目标 VC 的视图,因此您可能需要在目标 VC 上设置一些状态(例如一个 login/signup 枚举 属性),然后在调用 -viewDidLoad 时用于适当地设置 VC。