Как игнорировать параметр отправителя UIButton
Я использовал функцию как @IBAction
но теперь я хочу использовать его как обычную функцию. Но проблема в том, что когда я пытаюсь вызвать функцию, она запрашивает отправителя и ожидает UIButton
в качестве параметра. Как я могу удалить этого отправителя, чтобы он не влиял на мою функцию?
Вот моя функция:
func addProductToCartButton(_ sender: UIButton) {
// Start animation region
let buttonPosition : CGPoint = sender.convert(sender.bounds.origin, to: self.productsTableView)
let indexPath = self.productsTableView.indexPathForRow(at: buttonPosition)!
let cell = productsTableView.cellForRow(at: indexPath) as! ProductTableViewCell
let imageViewPosition : CGPoint = cell.productImageView.convert(cell.productImageView.bounds.origin, to: self.view)
let imgViewTemp = UIImageView(frame: CGRect(x: imageViewPosition.x, y: imageViewPosition.y, width: cell.productImageView.frame.size.width, height: cell.productImageView.frame.size.height))
imgViewTemp.image = cell.productImageView.image
animationProduct(tempView: imgViewTemp)
// End animation region
}
Вот где мне нужно вызвать функцию:
func didTapAddToCart(_ cell: ProductTableViewCell) {
let indexPath = self.productsTableView.indexPath(for: cell)
addProductToCartButton( expecting UIBUTTON parameter)
}
Я пытался установить отправителя как nil
но не работает. Есть ли у вас какие-либо идеи?
4 ответа
Вы должны реорганизовать свой код. Текущая реализация addProductToCartButton
использует отправителя (кнопку) для определения пути индекса. А затем остальная часть кода основана на этом пути индекса.
Тогда у вас есть didTapAddToCart
метод, который пытается вызвать addProductToCartButton
но у вас нет кнопки на данный момент, но у нее есть индексный путь.
Я хотел бы создать новую функцию, которая принимает путь индекса в качестве параметра. Его реализация представляет собой большую часть существующего кода в addProductToCartButton
,
Вот новая функция (которая в основном является оригинальной addProductToCartButton
код):
func addProduct(at indexPath: IndexPath) {
let cell = productsTableView.cellForRow(at: indexPath) as! ProductTableViewCell
let imageViewPosition : CGPoint = cell.productImageView.convert(cell.productImageView.bounds.origin, to: self.view)
let imgViewTemp = UIImageView(frame: CGRect(x: imageViewPosition.x, y: imageViewPosition.y, width: cell.productImageView.frame.size.width, height: cell.productImageView.frame.size.height))
imgViewTemp.image = cell.productImageView.image
animationProduct(tempView: imgViewTemp)
// End animation region
}
Затем повтори addProductToCartButton
как:
func addProductToCartButton(_ sender: UIButton) {
// Start animation region
let buttonPosition : CGPoint = sender.convert(sender.bounds.origin, to: self.productsTableView)
let indexPath = self.productsTableView.indexPathForRow(at: buttonPosition)!
addProduct(at: indexPath)
}
И наконец, обновление didTapAddToCart
:
func didTapAddToCart(_ cell: ProductTableViewCell) {
let indexPath = self.productsTableView.indexPath(for: cell)
addProduct(at: indexPath)
}
Подход 1 (рекомендуется):
Вы можете сделать этот аргумент необязательным:
@IBAction func addProductToCartButton(_ sender: UIButton?)
{
// Do your stuff here
}
Теперь вы можете назвать это как:
addProductToCartButton(nil)
Подход 2 (не рекомендуется)
Если вы не хотите делать аргумент необязательным, вы можете назвать его следующим образом:
addProductToCartButton(UIButton()) // It's not recommended
Подход 3 (рекомендуется)
Просто напишите еще одну служебную функцию и добавьте в нее код (добавьте код, написанный внутри IBAction, к этой функции). Вместо звонка IBAction
из другой функции, вызовите эту служебную функцию.
Простирающийся Midhun MP
Ответ вы можете сделать вызов функции еще проще, предоставив значение по умолчанию nil
:
@IBAction func addProductToCartButton(_ sender: UIButton? = nil) {
// Do your stuff here
}
Затем вы можете вызвать функцию следующим образом:
addProductToCartButton()
Самый простой подход для этого типа логики - передать значение nil в качестве параметра, это было бы так,
addProductToCartButton(nil)
Просто убедитесь, что вы не используете какое-либо свойство кнопки в своей функции. Но если вы используете свойство кнопки, просто добавьте проверку в вашей функции следующим образом:
func addProductToCartButton(_ sender: UIButton) {
if sender != nil {
//Do Something
}
}
Надеюсь, что это решит вашу проблему, Спасибо за чтение.