Добавление цели к кнопке выдает ошибку - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть следующий код:

for i in 0...album.count-1 {
    let button: UIButton = {
        let bt = UIButton()
        bt.translatesAutoresizingMaskIntoConstraints = false
        bt.tintColor = UIColor.black
        bt.backgroundColor = .clear
        bt.addTarget(self, action: #selector(buttonPressed(sender: button, image: imageView)), for: .touchUpInside)
        bt.tag = i
        buttonPosition += 160
        bt.layer.cornerRadius = 5
        return bt
    }()

    //Stuff that you don't need

    let imageView: UIImageView = {
        let iv = UIImageView()
        iv.image = images[i]
        iv.contentMode = .scaleAspectFill
        iv.clipsToBounds = true
        iv.translatesAutoresizingMaskIntoConstraints = false
        return iv
    }()
}

@objc func buttonPressed(sender: UIButton!, image: UIImageView!) {
    let animator = UIViewPropertyAnimator.init(duration: 0.2, curve: .linear) {
        image.transform = CGAffineTransform.init(translationX: (image.frame.width + 12) * -1, y: image.frame.origin.y )
    }
    animator.startAnimation()
}

Распечатывает эту ошибку:

Переменная, используемая в пределах своего начального значения

Чтоя могу сделать, чтобы создать функцию, которая использует в качестве параметров ту кнопку и тот imageView, который я создал в цикле?

В конце концов, как я могу создать локальную функцию?

1 Ответ

0 голосов
/ 23 февраля 2019

Вы ссылаетесь на button из самого замыкания, которое его создает (в предложении селектора), поэтому вы получаете эту ошибку.Это должно работать нормально, если вы измените #selector(buttonPressed(sender: button, image: imageView)) на #selector(buttonPressed(sender: bt, image: imageView)).Однако более чистый способ сделать это - создать заводскую функцию, например:

func makeButton(at position: CGFloat, taggedWith tag: Int) -> UIButton {
            let bt = UIButton()
            bt.translatesAutoresizingMaskIntoConstraints = false
            bt.tintColor = UIColor.black
            bt.backgroundColor = .clear
            bt.addTarget(self, action: #selector(buttonPressed(sender: button, image: imageView)), for: .touchUpInside)
            bt.tag = tag
            /// buttonPosition += 160 /// not sure what this is supposed to do but you'd use the position param here. 
            bt.layer.cornerRadius = 5
            return bt
}

Затем вы вызываете эту функцию для создания кнопок в цикле.Обратите внимание, что buttonPosition не используется.Также обратите внимание, что ваши кнопки не были добавлены в коллекцию или представление, поэтому вы можете проверить, где кнопки должны находиться и разместить их соответствующим образом.

...