如何将同一IBAction设置为多个按钮?

时间:2019-04-07 10:17:08

标签: swift

我试图将多个按钮与相同的IBAction链接在一起,以运行相似但不同的代码。该代码用于将在另一个视图控制器上单击的图像设置为按钮下方的UIImageView。 所有按钮链接到相同的视图控制器,但使用不同的按钮。

我试图编写一个if语句,但似乎不正确。我已命名每个对应的UIImage视图:technologyImageViewTwotechnologyImageViewThree ... etc

下面是我用于第一个按钮的代码,该代码与名为UIImageView的相应technologyImageView一起使用

@IBAction func setTechnology(segue:UIStoryboardSegue) {
        dismiss(animated: true) {

            if let technology = segue.identifier{
                self.persona.technology = technology
                self.technologyView.technologyImageView.image = UIImage(named: technology)
            }

            //animating scale up of image
            let scaleUp = CGAffineTransform.init(scaleX: 0.1, y:0.1)
            self.technologyView.technologyImageView.transform = scaleUp
            self.technologyView.technologyImageView.alpha = 0

            //animating bounce effect 
            UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.7, options: [], animations: {
                self.technologyView.technologyImageView.transform = .identity
                self.technologyView.technologyImageView.alpha = 1
            }, completion: nil)
        }

我希望每个按钮都应转到相应的视图控制器,并且所选图像将显示在相应按钮下。例如,如果我点击“技术2”按钮并选择一张图片,该图片就会显示在名为UIImageview的{​​{1}}中。

3 个答案:

答案 0 :(得分:0)

您可以使用三个单独的IBAction,它们都以UIImageView数字作为参数来调用同一函数。

func setTechnology(segue:UIStoryboardSegue, imageViewNumber: Int) {
    dismiss(animated: true) {

    var imageView: UIImageView!

    if imageViewNumber == 0 {
        imageView = self.technologyView.technologyImageView
    } else if imageView == 1 {
        imageView = self.technologyView.technologyImageViewTwo
    } else {
        imageView = self.technologyView.technologyImageViewThree
    }

    if let technology = segue.identifier{
        self.persona.technology = technology
        imageView.image = UIImage(named: technology)
    }

    //animating scale up of image
    let scaleUp = CGAffineTransform.init(scaleX: 0.1, y:0.1)
    imageView.transform = scaleUp
    imageView.alpha = 0

    //animating bounce effect 
    UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.7, options: [], animations: {
        imageView.transform = .identity
        imageView.alpha = 1
    }, completion: nil)
}

然后从三个单独的IBAction内部调用此函数。

@IBAction func tappedButtonZero(segue:UIStoryboardSegue) {
    self.setTechnology(segue: segue, imageViewNumber: 0)
}

@IBAction func tappedButtonOne(segue:UIStoryboardSegue) {
    self.setTechnology(segue: segue, imageViewNumber: 1)
}

@IBAction func tappedButtonTwo(segue:UIStoryboardSegue) {
    self.setTechnology(segue: segue, imageViewNumber: 2)
}

答案 1 :(得分:0)

有两个选项,您可以选择:

选项1:

更可取的是此选项,即使用组件上的tag属性,这将使您可以在操作按钮后识别按钮的索引。

https://developer.apple.com/documentation/uikit/uiview/1622493-tag

@IBAction func action(_ sender: Any) {
    dismiss(animated: true) {
         var imageView: UIImageView!
         let index = (sender as? UIView)?.tag ?? 0

         switch index {
         case 1:
             persona.technology = <#T##String#>
             imageView = technologyView.technologyImageViewTwo
         case 2:
             persona.technology = <#T##String#>
             imageView = technologyView.technologyImageViewThree
         default:
             persona.technology = <#T##String#>
             imageView = technologyView.technologyImageView
        }

        if let technology = persona.technology {
             imageView.image = UIImage(named: technology)
        }

        //animating scale up of image
        let scaleUp = CGAffineTransform.init(scaleX: 0.1, y:0.1)
        imageView.transform = scaleUp
        imageView.alpha = 0

        //animating bounce effect
        UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.7, options: [], animations: {
            imageView.transform = .identity
            imageView.alpha = 1
        })
    }
}

选项2:

如果要继续使用已有的代码,则可以使用segue标识符,其中包含可以拆分的组件,并使您可以更有效地识别它们:

  

segueIdentifier-1,segueIdentifier-2,segueIdentifier-3

func setTechnology(segue: UIStoryboardSegue) {
     dismiss(animated: true) {

        var imageView: UIImageView!
        let identifierComponents = segue.identifier?.components(separatedBy: "-")
        let index = Int(identifierComponents?.last ?? "0")

        switch index {
        case 1:
            imageView = technologyView.technologyImageViewTwo
        case 2:
            imageView = technologyView.technologyImageViewThree
        default:
            imageView = technologyView.technologyImageView
        }

        if let technology = identifierComponents?.first {
            self.persona.technology = technology
            imageView.image = UIImage(named: technology)
        }

        //animating scale up of image
        let scaleUp = CGAffineTransform.init(scaleX: 0.1, y:0.1)
        imageView.transform = scaleUp
        imageView.alpha = 0

        //animating bounce effect
        UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.7, options: [], animations: {
            imageView.transform = .identity
            imageView.alpha = 1
        })
    }
}

答案 2 :(得分:0)

您可以将多个按钮拖到@IBAction上,并为每个按钮分配唯一的tag值。然后,使用switch语句执行所按按钮的独特操作。

@IBAction func tappedButton(_ sender: UIButton) {
    switch sender.tag {
    case 1:
        print("one")
    case 2:
        print("two")
    case 3:
        print("three")
    default:
        break
    }
}