#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
}
}