如何让一个按钮根据发送的变量连接到多个视图控制器,并发送一个新变量
How to have a button connect to multiple viewcontrollers based on a sent variable, and send a new variable
我试过用多种方式问这个问题,但没有找到任何运气。很难将我的问题压缩成一行。
这是我所在的位置:
- viewcontroller1发送一个变量("X"或"Y")给viewcontroller2
- viewcontroller2 有一个按钮。
- 如果发送到 viewcontroller2 的变量 == "x" viewcontroller2 上的按钮应该执行 segue 到 viewcontroller3,并将其 .title 作为变量发送到该视图控制器
- 如果变量 == "y" viewcontroller2 上的按钮应该执行 segue 到 viewcontroller4,并将其 .title 作为变量发送到该视图控制器
我可以执行第 1 步和第 2 步,但不会执行第 3 步和第 4 步。
这是我在 viewcontroller2 上的位置:
@IBAction func didTapButton(_ sender: Any) {
if sentvar == "X" {
performSegue(withIdentifier: "ToVC3", sender: self)
if sentvar == "Y" {
performSegue(withIdentifier: "ToVC4", sender: self)
然后在代码的下方,我添加了:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier) == "ToVC3" {
let newvar = segue.destination as! VC3
newvar.var = (sender as! UIButton).title(for: .normal)!
但是……没用。
我不明白如何结合 prepareforsegue 发送变量,以及 performsegue 依赖于先前发送的变量。
如果有帮助的话,我很乐意解释我尝试过的方法以及它是如何失败的,但是我整天都被这个问题困住了,希望有技能的人可以指出我正确的方向。
谢谢!
我不确定我是否完全理解你的问题。
但是您需要查看 prepare for segue 语句。
请看下面的代码。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if sender == ShowVC {
let yourVc = segue.destination as? YourViewController
yourVc?.YOUR_VARIABLE = VariableWithDataFromCurrentVc
}
}
可以用
调用
performSegue(withIdentifier: "ShowVC", sender: self)
然后你只需要检查变量,然后执行 segue 到正确的 VC。
那么在您的 viewController2
中存储 viewController3
和 viewController4
的 segueIdentifier。还要存储一个名为 letter
的变量。所以在 viewController2
中存储这些变量:
var letter = ""
var segueIdentifierThirdVC = "ToVC3"
var segueIdentifierFourthVC = "ToVC4"
当你从 ViewController1
到 ViewController2
时,你需要传递上面的 letter
变量。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination == "ToVC1" {
let viewController2 = segue.destination as? ViewController2
viewController2.letter = // either x or y
}
}
然后在您的 ViewController2
中,当您单击按钮并想要继续时,您只需进行以下检查:
func buttonClicked() {
if letter == "x" {
self.performSegue(withIdentifier: segueIdentifierThirdVC, sender: nil)
} else if letter == "y" {
self.performSegue(withIdentifier: segueIdentifierFourthVC, sender: nil)
}
}
确保您存储了正确的标识符。
更新
要在 viewController3
和 viewController4
中设置标题标签,请执行以下操作:
在viewController3
和viewController4
中存储一个名为:var title = ""
的变量
在 viewController2
中调用 buttonClicked 函数并启动 performSegue
之后,您可以这样做:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination == "ToVC3" {
let viewController3 = segue.destination as? ViewController3
viewController3.title = // pass title to ViewController3
} else if segue.destination == "ToVC4" {
let viewController4 = segue.destination as? ViewController4
viewController4.title = // pass title to ViewController4
}
}
我试过用多种方式问这个问题,但没有找到任何运气。很难将我的问题压缩成一行。
这是我所在的位置:
- viewcontroller1发送一个变量("X"或"Y")给viewcontroller2
- viewcontroller2 有一个按钮。
- 如果发送到 viewcontroller2 的变量 == "x" viewcontroller2 上的按钮应该执行 segue 到 viewcontroller3,并将其 .title 作为变量发送到该视图控制器
- 如果变量 == "y" viewcontroller2 上的按钮应该执行 segue 到 viewcontroller4,并将其 .title 作为变量发送到该视图控制器
我可以执行第 1 步和第 2 步,但不会执行第 3 步和第 4 步。
这是我在 viewcontroller2 上的位置:
@IBAction func didTapButton(_ sender: Any) {
if sentvar == "X" {
performSegue(withIdentifier: "ToVC3", sender: self)
if sentvar == "Y" {
performSegue(withIdentifier: "ToVC4", sender: self)
然后在代码的下方,我添加了:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier) == "ToVC3" {
let newvar = segue.destination as! VC3
newvar.var = (sender as! UIButton).title(for: .normal)!
但是……没用。 我不明白如何结合 prepareforsegue 发送变量,以及 performsegue 依赖于先前发送的变量。
如果有帮助的话,我很乐意解释我尝试过的方法以及它是如何失败的,但是我整天都被这个问题困住了,希望有技能的人可以指出我正确的方向。
谢谢!
我不确定我是否完全理解你的问题。
但是您需要查看 prepare for segue 语句。
请看下面的代码。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if sender == ShowVC {
let yourVc = segue.destination as? YourViewController
yourVc?.YOUR_VARIABLE = VariableWithDataFromCurrentVc
}
}
可以用
调用performSegue(withIdentifier: "ShowVC", sender: self)
然后你只需要检查变量,然后执行 segue 到正确的 VC。
那么在您的 viewController2
中存储 viewController3
和 viewController4
的 segueIdentifier。还要存储一个名为 letter
的变量。所以在 viewController2
中存储这些变量:
var letter = ""
var segueIdentifierThirdVC = "ToVC3"
var segueIdentifierFourthVC = "ToVC4"
当你从 ViewController1
到 ViewController2
时,你需要传递上面的 letter
变量。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination == "ToVC1" {
let viewController2 = segue.destination as? ViewController2
viewController2.letter = // either x or y
}
}
然后在您的 ViewController2
中,当您单击按钮并想要继续时,您只需进行以下检查:
func buttonClicked() {
if letter == "x" {
self.performSegue(withIdentifier: segueIdentifierThirdVC, sender: nil)
} else if letter == "y" {
self.performSegue(withIdentifier: segueIdentifierFourthVC, sender: nil)
}
}
确保您存储了正确的标识符。
更新
要在 viewController3
和 viewController4
中设置标题标签,请执行以下操作:
在viewController3
和viewController4
中存储一个名为:var title = ""
在 viewController2
中调用 buttonClicked 函数并启动 performSegue
之后,您可以这样做:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination == "ToVC3" {
let viewController3 = segue.destination as? ViewController3
viewController3.title = // pass title to ViewController3
} else if segue.destination == "ToVC4" {
let viewController4 = segue.destination as? ViewController4
viewController4.title = // pass title to ViewController4
}
}