如何忽略发送方参数UIButton

时间:2018-06-29 13:47:14

标签: ios swift uibutton sender

我曾经将函数用作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) } ,但无法正常工作。你有什么主意吗?

4 个答案:

答案 0 :(得分:3)

方法1(推荐):

您可以将该参数设为可选:

@IBAction func addProductToCartButton(_ sender: UIButton?)
{
   // Do your stuff here
}

现在您可以这样称呼:

addProductToCartButton(nil)

方法2(不推荐)

如果您不想将参数设为可选,则可以这样命名:

addProductToCartButton(UIButton()) // It's not recommended

方法3(推荐)

只需编写另一个实用程序函数,然后在其中添加代码(将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
    }
}

希望这能解决您的问题,谢谢阅读。