如何制作两个segue函数?

时间:2017-07-10 06:46:53

标签: ios swift segue

如何制作两个segue覆盖函数?

@IBAction func doneBut(_ sender: UIButton) {
    print("Done")
    if pointInput.text!.characters.count < 500 {
        self.performSegue(withIdentifier: "toResult", sender: self)
    }
    else {
        self.performSegue(withIdentifier: "toWinner", sender: self)
    }

}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toResult" {
        if segue.destination is ResultViewController {

        }
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toWinner" {
        if segue.destination is ResultViewController {

        }
    }
}

当我执行另一个覆盖功能时 - 错误是

  

'prepare(for:sender :)'已被覆盖

4 个答案:

答案 0 :(得分:5)

您只能覆盖一次。使用if语句匹配不同的标识符。试试这个。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toResult" {
        if segue.destination is ResultViewController {

        }
    } else if segue.identifier == "toWinner" {
        if segue.destination is ResultViewController {

        }
    }
}

答案 1 :(得分:1)

不,你不应该两次写相同的功能。这正是这个错误所说的。

  

'prepare(for:sender :)'已被覆盖

该功能已被覆盖。

尝试这样写:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toResult" {
        if segue.destination is ResultViewController {

        }
    else  if segue.identifier == "toWinner" {
        if segue.destination is ResultViewController {

        }
      }
 }

答案 2 :(得分:1)

您必须仅覆盖prepare(for一次,并通过switch上的identifier来区分这些细分:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    switch segue.identifier {
      case "toResult":
        let destination = segue.destination as! ResultViewController 
        // prepare something

      case "toWinner":
        let destination = segue.destination as! ResultViewController 
        // prepare something

      default: break
    }
}

要在Int值上切换输入,请使用此版本进行类型检查:

@IBAction func doneBut(_ sender: UIButton) {
    print("Done")
    guard let inputText = pointInput.text, let inputInt = Int(inputText) else { 
          // inform the user about the error if needed
          return 
    }
    if inputInt < 500 {
        self.performSegue(withIdentifier: "toResult", sender: self)
    }  else {
        self.performSegue(withIdentifier: "toWinner", sender: self)
    }
}

答案 3 :(得分:0)

让我们尝试从错误消息中了解您的问题。

  

&#39;准​​备(对于:发送方:)&#39;已经被覆盖了

你不能拥有相同的方法(具有相同的定义),然后在同一个类中使用相同的方法,而不是OOP。

<小时/> 假设在早上你的父亲说,#34;在上午8点,你必须去学校,如何&#34;。
过了一段时间,你妈妈过来告诉你&#34;早上8点你必须到你的阿姨回家帮助她#34;。

现在你变得混乱和愤怒,因为你不知道你将在上午8点做什么? 这也是您的编译器所发生的事情,并显示错误,请告诉我当您调用此函数时要做的事情&#34; prepare(for:sender :)&#34;

<小时/>

您已经知道问题的解决方案,所以不要在此发布。
在这里,我只是想让你知道如果我们理解它很容易解决我们的问题。
我认为vadian为你提供了很好的解决方案,