Я пытаюсь связать несколько кнопок с одним и тем же 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, и выбранное изображение будет отображаться под соответствующей кнопкой. Например, если я нажму кнопку «Технология 2» и выберу изображение, оно появится в UIImageview
с именем technologyImageViewTwo
.
@ArashEtemad Как мне это сделать? Извините, я все еще новичок в Swift
Подключите розетку к каждой кнопке и переключитесь sender
. Это то же самое, что и теги, но без магических чисел. Или объявите отдельные методы IBActions
и переместите общую реализацию в метод разные.
@Toto Что стало с этим вопросом?
@Adrian Я понял, что моя проблема была связана с тем, как я соединил кнопки, с кодом, связанным с переходом, а не с кнопкой, мне пришлось переосмыслить способ упорядочивания моего кода.
Вы можете использовать три отдельных 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)
}
Есть несколько вариантов, из которых вы можете выбрать:
Опция 1:
Этот вариант был бы более предпочтительным, то есть использовать свойство тега для компонента, это позволит вам определить индекс кнопки, когда она была нажата.
https://developer.apple.com/documentation/uikit/uiview/1622493-тег
@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
})
}
}
Я попробовал вариант 2, но кажется, что обновляется только первое изображение, независимо от того, какую кнопку я нажимаю. Как я могу пойти по первому варианту? Извините, новичок в Swift
Можете ли вы предоставить мне пример перехода, который вы пробовали для варианта 2.
Дан пример IBAction с тегами.
Не знаю, что случилось, но половина моего ответа исчезла!, исправлено
Я не думаю, что объяснил это хорошо, извините. Моя проблема основана на двух разных контроллерах представления. Контроллер 1-го вида с кнопкой технологии и контроллер 2-го вида с кнопками изображения. код, который я первоначально показал выше, связан как закрытие перехода для изображений во втором контроллере представления, а не для кнопок в 1-м контроллере представления. Таким образом, код запускается при нажатии кнопки изображения во втором контроллере представления. Кнопки технологий имеют только переходную связь со вторым контроллером представления с кнопками изображения. Итак, я думаю, мне нужно переупорядочить мой код?
Хорошо, тогда я обновлю свой ответ, и вам следует использовать второй вариант.
Я попробовал вашу вторую версию, но я получаю следующую ошибку в части let technology = identifierComponents?.first
«Невозможно присвоить значение типа« String.SubSequence »(также известное как« Подстрока ») для типа« Строка »»
Спасибо, он создает, но по-прежнему обновляет только первое изображение, я получаю следующее предупреждение: «Переменная 'identifierComponents' никогда не изменялась; рассмотрите возможность изменения на константу 'let'» «Переменная 'index' никогда не изменялась; рассмотрите возможность изменения на 'let' постоянный"
Можете ли вы прислать мне пример идентификатора перехода
Я не уверен, как это показать, но я связал свой проект xcode здесь: drive.google.com/open?id=1OE4sf8pJF_DYl6OyngdvJnsDjO36LPPR Если вы перейдете к main.storyboard, переход с действием представляет собой массив изображений на контроллере технологического представления.
Хорошо, я посмотрел ваш проект, есть несколько проблем. Ваша функция setTechnology
работает, потому что вы пытаетесь отклонить viewController, который нельзя отклонить. С вашим переходом и корреляцией имени изображения код, представленный в моем примере, без исключения, является ответом, который вам нужен, но когда вы используете UIImage(named: technology)
, вам нужен актив, называемый этой идентификацией! ВСЕ ваши переходы имеют showTechnology
, и вы используете это как имя изображения, поэтому, даже если у вас есть изображение с именем showTechnology
, все действия будут одинаковыми!
Думаю, вам нужно посмотреть, чего вы пытаетесь достичь, и посмотреть на маршрут тега, который я объяснял ранее.
Я вернул свой ответ к двум вариантам, поскольку они оба актуальны.
Вы можете перетащить несколько кнопок на свой @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
}
}
Вы можете использовать тег, установить тег для каждой кнопки, проверить это методом
IBAction
и принять решение на основе количества тегов.