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

Ios 如何在目标视图控制器上识别segue标识符?,ios,swift,swift3,Ios,Swift,Swift3,我有两个视图控制器,第一个有两个按钮,注册和登录,第二个VC做注册和登录的功能(我写了在注册和登录模式之间切换的函数),是否可以确定用户是否在第一个VC中按下了登录/注册按钮,以便在执行segue时在第二个VC中调用正确的功能?您已经告诉第二个视图控制器在选择第一个视图控制器选项(登录或注册)后要做什么。我假设您可以通过简单地声明一个标志并将其发送到第二个视图控制器来实现这一点,例如: 在第二个视图控制器中声明一个布尔变量(比如说shouldBehavesAsLogin),这意味着如果选择是lo

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

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

在第二个视图控制器中声明一个布尔变量(比如说
shouldBehavesAsLogin
),这意味着如果选择是login,那么它应该是
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
以相反的方式工作


附加提示:

如果为每个按钮添加iAction的目的只是导航到第二个视图控制器,我建议让这两个按钮具有相同的iAction,但是您应该让
发送方
的类型为
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
}

此答案假设两个视图控制器之间只有一个分段。如果有多个,只需在
prepareforsgue
中使用序列标识符即可

我可以通过在
-prepare(对于segue:sender:)
-performsgue(with identifier:sender)
上使用
sender
参数来处理这个问题,这取决于您是直接从按钮还是在代码中触发segue

如果按钮触发segue,您可以测试
发送方
参数是否为两个相关按钮之一,并在目标VC上执行适当的设置。如果segue在
iAction
方法的代码中被触发,您可以从
iAction
s
sender
参数传递按钮引用,或者传递
prepareforsgue
方法能够处理的其他标识对象


请记住,调用
prepareforsgue
时,目标VC的视图将不会加载,因此您可能需要在目标VC上设置一些状态(例如登录/注册枚举属性)当调用VC的
-viewDidLoad
时,它将用于正确设置VC。

如果只有一个目标视图控制器,则标识符不相关。使用按钮标题、标签、自定义枚举等来区分模式,并在
prepareforsgue
中将其传递给第二个视图控制器。效果非常好!非常感谢你。上帝保佑你,兄弟:)@Abdullah很乐意帮忙:)