这是我之前发布的帖子(Incorrect data passed on first click of button)的后续内容。它被回答了,但当然发生了更新的编辑。
我的查询如下,目前我有两个空的IBActions函数,缺少任何类型的代码,它们存在的唯一目的是它们连接到我的其他视图控制器,因此如果我删除它们我无法区分应该使用哪个segue(我的理解是虽然我们可以在两个视图控制器之间创建segue,但我认为不会有任何一个是有意义的(如,如何决定哪一个)我离题了。
我之前尝试在我的代码中使用以下内容:
self.performSegue(withIdentifier: "slideTwo", sender: self);
这种方法效果很好,但确实会导致双重错误。因此,我解决了以下问题:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
let passedPic = segue.destination as! ViewControllerTwo;
if(segue.identifier == "slideOne") {
passedPic.picsChosen = sLS1;
} else {
passedPic.picsChosen = sLS2;
}
}
这很好用,做我需要的,但我确实有两个空IBActions的问题:
@IBAction func slideShowOne() {
}
@IBAction func slideShowTwo() {
//self.performSegue(withIdentifier: "slideTwo", sender: self);
}
这是我想的,也许我可以尝试创建一个getter / setter(swift比它真实应该更复杂)。这是我迷失的地方。
代码如下:
var picsChosen : [String] {
set(newData) {
for index in 0..<newData.count {
print("Index is: ", newData[index]);
}
self._picsChosen = newData;
} get {
return self._picsChosen;
}
}
现在,我的问题有两个问题。首先,实际访问并将值传递给变量的正确方法是什么。我尝试过:myClass: ViewControllerTwo! = ViewControllerTwo();
然后使用myClass.picsChosen = myArray;
但是,虽然看起来数据已成功传递到我的VC2中,但是当我循环(在setter中)时,我确实看到成功显示的值,当我尝试访问picsChosen
之外我得到一个索引越界错误,换句话说,该值从未与picsChosen
相关联。我目前使用它的方式效果很好,但我想知道使用getter / setter的正确方法是什么,以及为什么我没有工作。
干杯!
答案 0 :(得分:3)
这很好用,做我需要的,但我确实有问题 两个空的IBActions:
您不需要这些空的@IBAction
。他们没有为你做任何事情。 segue是从Storyboard中的按钮连接的,因此您不需要@IBAction
。如果您删除了代码,则还需要从Storyboard中删除该连接,否则当您尝试调用已删除的@IBAction
时,您的应用会崩溃。要删除, control - 单击故事板中的按钮,然后单击 Touch Up Inside 旁边的小x
以删除连接。然后,您可以删除代码中的@IBAction
。
如果我删除它们,我无法区分哪个segue 应该使用
不正确。您有两个不同的segue连接两个不同的按钮。 segue的标识符是您区分两个segue的方式。
我尝试过:
myClass: ViewControllerTwo! = ViewControllerTwo();
使用segue时,segue会为您创建目标viewController。
这不起作用,因为您在这里创建了一个全新的ViewControllerTwo
。您将值传递给此新实例,但这不是Storyboard segue为您创建的ViewControllerTwo
。
使用segues时,您应该传递prepare(for:sender:)
中的数据,就像上面显示的那样。获取目标ViewController并填写您想要传递的数据。
现在对于你没有问过的问题:
我怎样才能使用
@IBAction
来触发 原因请看?
删除从按钮连接的segue。
将segue从viewController1连接到viewController2。单击故事板中的segue箭头并指定标识符slideShow
。
为您的两个按钮分配唯一标签。您可以在 Interface Builder 中进行设置。提供第一个按钮标记1
和第二个按钮标记2
。
您的按钮可以共享相同的@IBAction
:
@IBAction func goToSlideShow(button: UIButton) {
self.performSegue(withIdentifier: "slideShow", sender: button)
}
在prepare(for:sender:)
:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
let passedPic = segue.destination as! ViewControllerTwo
if let button = sender as? UIButton {
if button.tag == 1 {
passedPic.picsChosen = sLS1
} else if button.tag == 2 {
passedPic.picsChosen = sLS2
}
}
}