如何让一个按钮根据发送的变量连接到多个视图控制器,并发送一个新变量
Posted
技术标签:
【中文标题】如何让一个按钮根据发送的变量连接到多个视图控制器,并发送一个新变量【英文标题】:How to have a button connect to multiple viewcontrollers based on a sent variable, and send a new variable 【发布时间】:2017-05-28 21:56:03 【问题描述】:我尝试过多种方式来问这个问题,但没有找到任何运气。很难将我的问题压缩成一行。
这是我所在的位置:
-
viewcontroller1 向 viewcontroller2 发送一个变量(“X”或“Y”)
viewcontroller2 有一个按钮。
如果发送到 viewcontroller2 == "x" 的变量,则 viewcontroller2 上的按钮应该执行到 viewcontroller3 的 segue,并将其 .title 作为变量发送到该视图控制器
如果变量 == "y",viewcontroller2 上的按钮应该执行到 viewcontroller4 的 segue,并将其 .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来发送一个变量,而performegue依赖于之前发送的变量。
如果有帮助,我很乐意解释我尝试过的方法以及它如何不起作用,但是我整天都被这个问题所困扰,希望有技能的人可以为我指明正确的方向.
谢谢!
【问题讨论】:
从viewcontroller2
添加代码的相关部分。其中包括 UIButton
s IBAction
和您的 prepare(for:, sender:)
方法以及持有“变量”的属性。
您的方法看起来是正确的。当您尝试时,究竟是什么不起作用?
罗伯特:当我按下 viewcontroller2 上的按钮时,我收到“Thread1 信号:SIGABRT”崩溃和错误提示:“无法将 'myproject.viewcontroller2' (0x101af1ab0) 类型的值转换为 'UIButton '"
【参考方案1】:
在您的viewController2
中存储viewController3
和viewController4
的segueIdentifier。还要存储一个名为letter
的变量。所以在viewController2
store 这些变量:
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
【讨论】:
谢谢!我已经设置好了,但仍然不知道如何将按钮点击广告的标题发送到 viewcontroller3 或 4。 谢谢!我试图让按钮的标题被传递,所以我试图使用: let newvar = segue.destination as! VC3 newvar.var = (sender as!UIButton).title(for: .normal)!但我收到错误/崩溃 尝试将其设置在viewDidLoad
而不是button.setTitle(title, for: .normal)
是的,就是这样!
非常感谢。它让我更接近,我发现我的代码中有一些错误,基于你的。谢谢!【参考方案2】:
我不确定我是否完全理解您的问题。
但是你需要查看一个为 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)
然后您只需检查变量,然后对正确的 VC 执行 segue。
【讨论】:
谢谢。我可以将变量从一个视图控制器传递到下一个视图控制器,但如果我还需要根据已经传递给它的变量来按钮转到两个视图控制器之一,我不知道该怎么做。跨度> 我刚刚看到你编辑了你的问题。但是为什么要传入按钮呢?我仍然不确定你想要实现什么。 是的,我编辑了我的问题以显示到目前为止我尝试过的代码。我想将按钮的名称作为变量发送到 viewcontroller 3 或 viewcontroller4。变量 x 或 y(已从 viewcontroller1 发送到 viewcontroller2 指定按钮将其标题发送到哪个 viewcontroller。 请看这里@tfcamp github.com/Grumme/Segue-project。我创建了一个简单的项目,但我仍然不确定它是否在做你想要实现的目标。 非常感谢!一切看起来都很好,直到 viewcontroller2... 从那里我希望该按钮转到 viewcontroller3 如果 x 被传递,或者 viewcontroller4 如果 y 被传递。我还希望 viewcontroller2 上的按钮将其按钮标题发送到 viewcontroller3 或 4。以上是关于如何让一个按钮根据发送的变量连接到多个视图控制器,并发送一个新变量的主要内容,如果未能解决你的问题,请参考以下文章
使用多个 ViewController、Xcode 将代码连接到情节提要中的 UI