Как я могу установить один и тот же IBAction на несколько кнопок? - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь связать несколько кнопок с одним и тем же IBAction, чтобы запустить похожий, но другой код. Код должен установить изображение, которое было нажато на другом контроллере представления, в UIImageView под кнопкой. Все кнопки связаны с одним и тем же контроллером представления, но с разным переходом.

Я пытался написать оператор if, но, похоже, у меня не получилось. Я назвал каждое соответствующее UIImage представление: technologyImageViewTwo, technologyImageViewThree ... и т. Д.

ниже - код, который я использовал для первой кнопки, которая работает с соответствующим 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)
        }

Я ожидаю, что каждая кнопка должна перейти к контроллеру segued view, а выбранное изображение появится под соответствующей кнопкой. Например, если я нажму на кнопку «Технология 2» и выберу изображение, оно появится в UIImageview с именем technologyImageViewTwo.

Ответы [ 3 ]

0 голосов
/ 07 апреля 2019

Есть несколько вариантов, из которых вы можете выбрать:

Вариант 1:

Этот вариант будет более предпочтительным, то есть использовать свойство тега для компонента, это позволит вам определить индекс кнопки, когда она была нажата.

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:

Если вы хотите продолжить работу с имеющимся у вас кодом, вы можете использовать идентификатор сегмента, содержащий компоненты, которые вы можете разделить и которые позволят вам более эффективно идентифицировать их:

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
        })
    }
}
0 голосов
/ 07 апреля 2019

Вы можете перетащить несколько кнопок на @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
    }
}
0 голосов
/ 07 апреля 2019

Вы можете использовать три отдельных IBActions, которые все вызывают одну и ту же функцию с номером 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)
}

И затем вызывать эту функцию из трех отдельных IBActions.

@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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...