У меня есть 2 группы UIButtons
с Pass или Fail. Мне нужно проверить, была ли в обеих группах нажата какая-либо из кнопок UIButtons (пройдено или не пройдено), чтобы прокрутить вниз до следующего вопроса.
Я использую делегат с 4 параметрами (мои 4 кнопки), и я делаю if
проверку, но никогда не вхожу в мое if
условие. Вот как выглядит моя группа кнопок:
Вот мой код:
func tappedOnVehicleOrTrailerButtons(vehiclePassBtn: UIButton, vehicleFailBtn: UIButton, trailerPassBtn: UIButton, trailerFailBtn: UIButton) {
if (vehiclePassBtn.isTouchInside || vehicleFailBtn.isTouchInside) && (trailerPassBtn.isTouchInside || trailerFailBtn.isTouchInside) {
scrollDown()
}
}
Вот метод делегата:
// Check if the user press Pass or Fail btn for Vehicle or Trailer
@IBAction func passOrFailBtnTapped(_ sender: UIButton) {
delegate?.tappedOnVehicleOrTrailerButtons(vehiclePassBtn: vehiclePassButton, vehicleFailBtn: vehicleFailButton, trailerPassBtn: trailerPassButton, trailerFailBtn: trailerFailButton)
}
Есть ли другой способ сделать это вместо оператора if
?
когда вы вызываете этот метод tappedOnVehicleOrTrailerButtons?
Все 4 кнопки подключены к одной и той же функции IBAction, где я вызываю делегата.
Перед вызовом делегата присвойте sender.isSelected = true и проверьте VehiclePassBtn.isSelected в методе tappedOnVehicleOrTrailerButtons.
Я добавил метод делегата, в котором связаны все 4 кнопки.
RajeshKumar R оставить комментарий, чтобы принять его. Работал над твоей идеей.
Код внутри вашего оператора if
никогда не будет достигнут. Согласно документации Apple
isTouchInside
is a Boolean value indicating whether a tracked touch event is currently inside the control’s bounds.
Акцент на В настоящее время. Таким образом, никакие две кнопки не будут одновременно нажаты.
Для достижения вашей цели вашим кнопкам нужно какое-то состояние, с помощью которого вы можете проверить, была ли кнопка нажата. Вы можете просто подклассировать кнопку и добавить атрибут wasTouched
, например. грамм.
class StateButton: UIButton {
override func awakeFromNib() {
super.awakeFromNib()
self.addTarget(self, action: #selector(self.buttonWasTouched), for: .touchUpInside)
}
@objc private func buttonWasTouched() {
self.isSelected = true
}
}
Тогда ваш метод делегата будет выглядеть так:
func tappedOnVehicleOrTrailerButtons(vehiclePassBtn: StateButton, vehicleFailBtn: StateButton, trailerPassBtn: StateButton, trailerFailBtn: StateButton) {
if (vehiclePassBtn.isSelected || vehicleFailBtn.isSelected) && (trailerPassBtn.isSelected || trailerFailBtn.isSelected) {
scrollDown()
}
}
if (vehiclePassBtn.isSelected || vehicleFailBtn.isSelected) && (trailerPassBtn.isSelected || trailerFailBtn.isSelected) { scrollDown() }
Этот способ отлично работает для меня.
Да, вы также можете использовать свойство isSelected
самой кнопки. Я действительно думаю, что это было бы лучшим решением; Я обновил свой ответ соответственно.
Убедитесь, что у вас есть ссылка для каждой кнопки. Затем используйте состояние
isSelected
для различения между проверенным и непроверенным (вы должен реализуете пользовательскую логику - нет поведения по умолчанию аляUISwitch
), а затем просто реализуйте любую логику проверки, основанную на этом. Нет необходимости в делегировании или функциях с несколькими аргументами. Я надеюсь, что это имеет смысл...