Как игнорировать параметр отправителя UIButton - PullRequest
0 голосов
/ 29 июня 2018

Я использовал функцию как @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 ]

0 голосов
/ 29 июня 2018

Вам необходимо провести рефакторинг вашего кода. Текущая реализация 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)
}
0 голосов
/ 29 июня 2018

Расширяя Midhun MP s ответ, вы можете сделать вызов функции еще проще, предоставив значение по умолчанию nil:

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

Затем вы можете вызвать функцию следующим образом:

addProductToCartButton()
0 голосов
/ 29 июня 2018

Ну, самый простой подход для этого типа логики - передать ноль значение в качестве параметр , это было бы так,

addProductToCartButton(nil)

Просто убедитесь, что вы не используете какое-либо свойство кнопки в своей функции. Но если вы используете свойство кнопки, просто добавьте проверку в вашей функции следующим образом:

func addProductToCartButton(_ sender: UIButton) {

    if sender != nil {
        //Do Something
    }
}

Надеюсь, это решит вашу проблему. Спасибо, что прочитали это.

0 голосов
/ 29 июня 2018

Подход 1 (рекомендуется):

Вы можете сделать этот аргумент необязательным:

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

Теперь вы можете назвать это как:

addProductToCartButton(nil)

Подход 2 (не рекомендуется)

Если вы не хотите, чтобы аргумент был необязательным, вы можете назвать его следующим образом:

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

Подход 3 (рекомендуется)

Просто напишите еще одну служебную функцию и добавьте в нее код (добавьте код, написанный внутри IBAction, к этой функции). Вместо вызова IBAction из другой функции, вызовите эту служебную функцию.

...