Swift: как получить доступ к одному объекту (например, к кнопке) в коллекции @IBAction, чтобы вернуть отправителя в новую функцию?

Я создаю простой калькулятор и поместил пару кнопок с цифрами в @IBAction. Я обращаюсь к sender.title нажатой кнопки, чтобы обновить метку ввода следующим образом:

 @IBAction func numberButtonTapped(_ sender: UIButton) {
        guard let numberButton = sender.title(for: .normal) else {return}

        updateInput(num: numberButton)
    }

Теперь я хотел бы анимировать каждую нажатую кнопку с помощью простого CGAFFineTransform (я знаю, как это делается), и я могу поместить анимацию в @IBAction, и, очевидно, это работает:

 @IBAction func numberButtonTapped(_ sender: UIButton) {
        guard let numberButton = sender.title(for: .normal) else {return}

        sender.transform = CGAffineTransform(scaleX: 1.2, y: 1.2) // completion handler to reverse the animation

        updateInput(num: numberButton)
    }

Но я хотел бы поместить анимацию в другую функцию, чтобы иметь доступ к ней из разных @IBActions и не пришлось бы снова и снова переписывать код, но я понятия не имею, как я могу передать "отправитель" в новая функция. Итак, как мне сообщить новой функции (назовем ее animateButton()), какой отправитель был нажат, чтобы sender.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)... знал бы, какую кнопку анимировать?

Спасибо


person RjC    schedule 16.10.2017    source источник


Ответы (1)


Создайте функцию, которая получает параметр UIButton as с вашим кодом анимации внутри:

func animateButton(anySender: UIButton) {
    // Your animation code here
    sender.transform = CGAffineTransform(scaleX: 1.2, y: 1.2) // completion handler to reverse the animation
}

Вызовите свою анимацию в любой функции, которой требуется анимация, передав отправителя в качестве параметра:

@IBAction func numberButtonTapped(_ sender: UIButton) {
        guard let numberButton = sender.title(for: .normal) else {return}

        animateButton(anySender: sender)
        updateInput(num: numberButton)
    }

ДОПОЛНИТЕЛЬНО: если вам нужно вызывать эту функцию из разных контроллеров, подумайте о том, чтобы сделать ее extension:

extension UIButton {
    func customAnimate() {
        // Your animation code here
        self.transform = CGAffineTransform(scaleX: 1.2, y: 1.2) // completion handler to reverse the animation
    }
}

и вызвать его с любой кнопки:

@IBAction func numberButtonTapped(_ sender: UIButton) {
        guard let numberButton = sender.title(for: .normal) else {return}

        sender.customAnimate()
        updateInput(num: numberButton)
    }
person jvrmed    schedule 16.10.2017
comment
Спасибо. Про расширения не подумал. Это хорошо работает! - person RjC; 16.10.2017