1
resposta

removeSelected - em uma funcao (Swift)

Estou seguindo o curso Swift parte 3 aula 5, porem não fiz o remover do item devido a um erro de compilação, estou usando uma função como no inicio da video aula. O problema é ao passar de uma classe para outra.

Segue os codigos para melhor entendimento:

RemoveViewController

class RemoveViewController{

    let controller:UIViewController

    init(controller: UIViewController) {
        self.controller = controller
    }

    func show (_ meal: Meal, removeSelected:@escaping (UIAlertAction) -> Void){
        let details = UIAlertController(title: meal.name, message: meal.details(), preferredStyle: UIAlertController.Style.alert)

        let remove = UIAlertAction(title: "Remove", style: UIAlertAction.Style.destructive, handler: removeSelected)
        details.addAction(remove)

        let cancel = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil)
        details.addAction(cancel)

        controller.present(details, animated: true, completion: nil)
    }
}

funcao sendo chamada:

@objc
    func showDetails(recognizer :UILongPressGestureRecognizer){

        if(recognizer.state == UIGestureRecognizer.State.began){

            let cell = recognizer.view as! UITableViewCell

            if let indexPath = tableView.indexPath(for: cell){
                let row = indexPath.row
                let meal = meals[row]

                func removeSelected(action: UIAlertAction){
                    meals.remove(at: row)
                    tableView.reloadData()
                }

                RemoveViewController(controller: self)
                    .show(meal,removeSelected: removeSelected(action: UIAlertAction))
            }

        }
    }
1 resposta

Olá Paulo, Verificando seu código notei que o método show da classe RemoveViewController espera uma clojure no argumento removeSelected.

Acredito que neste caso o código possa ser escrito da seguinte forma:

Antes:

func removeSelected(action: UIAlertAction){
                    meals.remove(at: row)
                    tableView.reloadData()
                }

                RemoveViewController(controller: self)
                    .show(meal,removeSelected: removeSelected(action: UIAlertAction))

Depois:

RemoveMealController(controller: self).show(meal, removeSelected: { action in
                        self.meals.remove(at: row);
                        self.tableView.reloadData()
                    })

Um ponto importante que notei é que você está colocando:

func removeSelected(action: UIAlertAction){
                    meals.remove(at: row)
                    tableView.reloadData()
                }

só que dentro de uma closure o meals não estaria disponível, neste caso seria interessante mudar ele para self.meals.

Espero ter ajudado.