Как я могу установить одно и то же IBAction для нескольких кнопок?

#swift

#swift

Вопрос:

Я пытаюсь связать несколько кнопок с одним и тем же 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 списке.

Комментарии:

1. Вы можете использовать tag, установить tag для каждой кнопки и проверить это в IBAction методе и принять решение на основе количества тегов

2. @ArashEtemad Как мне это сделать? Извините, я все еще новичок в swift

3. Подключите розетку к каждой кнопке и переключитесь sender . Это то же самое, что и теги, но без магических чисел. Или объявить отдельные IBActions методы и перенести общую реализацию в другой метод.

4. @Toto Что стало с этим вопросом?

5. @Adrian Я понял, что моя проблема заключалась в том, как я подключал кнопки, способ кода, связанный с переходом, а не с кнопкой, мне пришлось переосмыслить способ упорядочивания моего кода.

Ответ №1:

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

Вариант 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
        })
    }
}
  

Комментарии:

1. Я попробовал вариант 2, но, похоже, он обновляет только первое изображение, независимо от того, какую кнопку я нажимаю. Как я могу воспользоваться первым вариантом? Извините, совсем новичок в Swift

2. Можете ли вы предоставить мне пример перехода, который вы пробовали для варианта 2.

3. Приведен пример IBAction с тегированием.

4. Не знаю, что произошло, но половина моего ответа исчезла!, Исправлено

5. Я не думаю, что хорошо это объяснил, извините. Моя проблема связана с двумя разными контроллерами просмотра. 1-й контроллер просмотра с кнопкой технологии и 2-й контроллер просмотра с кнопками изображения. код, который я первоначально показал выше, связан как закрытие перехода для изображений в контроллере 2-го вида, а не для кнопок в контроллере 1-го вида. Итак, код запускается при нажатии кнопки изображения во втором контроллере просмотра. Технологические кнопки имеют только переходную ссылку на второй контроллер просмотра с кнопками изображения. Итак, я предполагаю, что мне нужно изменить порядок моего кода?

Ответ №2:

Вы могли бы использовать три отдельных 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)
}
  

Ответ №3:

Вы могли бы перетащить несколько кнопок на свою @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
    }
}