使用getter / setter的正确方法是什么?

时间:2017-01-18 03:11:40

标签: ios swift setter

致敬,

这是我之前发布的帖子(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的正确方法是什么,以及为什么我没有工作。

干杯!

1 个答案:

答案 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来触发   原因请看?

  1. 删除从按钮连接的segue。

  2. 将segue从viewController1连接到viewController2。单击故事板中的segue箭头并指定标识符slideShow

  3. 为您的两个按钮分配唯一标签。您可以在 Interface Builder 中进行设置。提供第一个按钮标记1和第二个按钮标记2

  4. 您的按钮可以共享相同的@IBAction

    @IBAction func goToSlideShow(button: UIButton) {
        self.performSegue(withIdentifier: "slideShow", sender: button)
    }
    
  5. 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
            }
        }
    }