我曾经将函数用作transaction processor
,但现在我想将其用作常规函数。但是问题是当我尝试调用该函数时,它正在询问我发件人,并期望将@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)
}
,但无法正常工作。你有什么主意吗?
答案 0 :(得分:3)
您可以将该参数设为可选:
@IBAction func addProductToCartButton(_ sender: UIButton?)
{
// Do your stuff here
}
现在您可以这样称呼:
addProductToCartButton(nil)
如果您不想将参数设为可选,则可以这样命名:
addProductToCartButton(UIButton()) // It's not recommended
只需编写另一个实用程序函数,然后在其中添加代码(将IBAction内部编写的代码添加到此函数中)。而不是从另一个函数调用IBAction
,而是调用此实用程序函数。
答案 1 :(得分:2)
您需要重构代码。 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)
}
答案 2 :(得分:1)
扩展Midhun MP
的答案,您可以通过提供默认值nil
使函数调用更加简单:
@IBAction func addProductToCartButton(_ sender: UIButton? = nil) {
// Do your stuff here
}
然后您可以像这样调用函数:
addProductToCartButton()
答案 3 :(得分:0)
这种逻辑最简单的方法是,将 nil值作为参数传递,就像这样
addProductToCartButton(nil)
只需确保您没有在函数中使用任何按钮属性。但是,如果您使用的是button属性,那么只需在函数中添加一个检查,就像这样,
func addProductToCartButton(_ sender: UIButton) {
if sender != nil {
//Do Something
}
}
希望这能解决您的问题,谢谢阅读。