【问题标题】:How to identify the segue identifier on destination view controller?如何识别目标视图控制器上的 segue 标识符?
【发布时间】:2018-01-28 14:13:34
【问题描述】:

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

【问题讨论】:

  • 如果只有一个目标视图控制器,则标识符无关紧要。使用按钮标题、标签、自定义枚举等来区分模式,并在prepareForSegue 中将其传递给第二个视图控制器。

标签: ios swift swift3


【解决方案1】:

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

在你的第二个视图控制器中声明一个布尔变量(比如说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 的类型为 @987654329 @ 而不是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
}

【讨论】:

  • 像魅力一样工作!非常感谢。上帝保佑你兄弟:)
  • @Abdullah 很高兴为您提供帮助 :)
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多