comment faire checkmark pour être sélectionné en fonction du tableau dans swift 3?

J'ai un tableau dans lequel le nom sélectionné sera stocké et transmis au controller de vue avant et quand jamais je dois aller controller de vue précédente, la coche sélectionnée précédemment doit être sélectionnée, mais ici il active le dernier élément sélectionné seulement le problème est si je sélectionne trois alors il ne sélectionne pas trois c'est cocher en marquant seulement le dernier élément mais j'ai besoin des trois choisis quelqu'un peut-il m'aider comment faire la coche à sélectionner pour trois éléments?

protocol ArrayToPass: class { func selectedArrayToPass(selectedSsortingngs: [Ssortingng]) } class FilterSelectionViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { var productName = [Ssortingng]() var productprice = [Ssortingng]() var imageArray = [Ssortingng]() var idArray = [Int]() let urlSsortingng = "http://www.json-generator.com/api/json/get/bOYOrkIOSq?indent=2" var values = [Ssortingng]() var selected: Bool? var delegate: ArrayToPass? var nameSelection: Bool? var namesArray = [Ssortingng]() override func viewDidLoad() { super.viewDidLoad() self.downloadJsonWithURL() tableDetails.separatorInset = UIEdgeInsets.zero activityIndicator.startAnimating() tableDetails.isHidden = true tableDetails.dataSource = self tableDetails.delegate = self let rightBarButton = UIBarButtonItem(title: "Apply", style: UIBarButtonItemStyle.plain, target: self, action: #selector(applyBarButtonActionTapped(_:))) self.navigationItem.rightBarButtonItem = rightBarButton tableDetails.estimatedRowHeight = UITableViewAutomaticDimension tableDetails.rowHeight = 60 // Do any additional setup after loading the view. } func applyBarButtonActionTapped(_ sender:UIBarButtonItem!){ self.delegate?.selectedArrayToPass(selectedSsortingngs: values) navigationController?.popViewController(animated: true) } func downloadJsonWithURL() { let url = NSURL(ssortingng: urlSsortingng) URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSArray { for item in jsonObj! { if let itemDict = item as? NSDictionary{ if let name = itemDict.value(forKey: "name") { self.productName.append(name as! Ssortingng) } if let price = itemDict.value(forKey: "value") { self.productprice.append(price as! Ssortingng) } if let image = itemDict.value(forKey: "img") { self.imageArray.append(image as! Ssortingng) } if let id = itemDict.value(forKey: "id") { self.idArray.append(id as! Int) } } } OperationQueue.main.addOperation({ self.tableDetails.reloadData() }) } }).resume() } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return productName.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "filterSelectionCell", for: indexPath) as! FilterSelectionCell activityIndicator.stopAnimating() activityIndicator.hidesWhenStopped = true tableDetails.isHidden = false cell.brandProductName.text = productName[indexPath.row] if nameSelection == true{ if namesArray.count != 0 { print(namesArray) for name in namesArray{ if productName[indexPath.row].contains(name){ print(productName[indexPath.row]) cell.accessoryType = .checkmark } else { cell.accessoryType = .none } } } } return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ selected = false if let cell = tableView.cellForRow(at: indexPath as IndexPath) { if cell.accessoryType == .checkmark{ cell.accessoryType = .none print("\(productName[indexPath.row])") values = values.filter{$0 != "\(productName[indexPath.row])"} selected = true } else{ cell.accessoryType = .checkmark } } if selected == true{ print(values) } else{ getAllTextFromTableView() } print(values) } func getAllTextFromTableView() { guard let indexPaths = self.tableDetails.indexPathsForSelectedRows else { // if no selected cells just return return } for indexPath in indexPaths { values.append(productName[indexPath.row]) } } 

voici l'image pour cela

Fondamentalement, ne manipulez pas la vue (la cellule). Utilisez un model de données.

 struct Product { let name : Ssortingng let value : Ssortingng let img : Ssortingng let id : Int var selected = false init(dict : [Ssortingng:Any]) { self.name = dict["name"] as? Ssortingng ?? "" self.value = dict["value"] as? Ssortingng ?? "" self.img = dict["img"] as? Ssortingng ?? "" self.id = dict["id"] as? Int ?? 0 } } 

Et n'utilisez jamais plusieurs arrays comme source de données . C'est une très mauvaise habitude.

Déclarez le tableau de source de données en tant que

 var products = [Product]() 

Analyser datatables JSON et faire une (meilleure) gestion des erreurs

 func downloadJsonWithURL() { let url = URL(ssortingng: urlSsortingng)! let task = URLSession.shared.dataTask(with: url) { (data, response, error) in if error != nil { print(error!); return } do { if let jsonObj = try JSONSerialization.jsonObject(with: data!) as? [[Ssortingng:Any]] { self.products = jsonObj.map{ Product(dict: $0) } DispatchQueue.main.async { self.tableDetails.reloadData() } } } catch { print(error) } } task.resume() } 

dans cellForRow... atsortingbuez le nom à l'label et cellForRow... en fonction de la selected

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "filterSelectionCell", for: indexPath) let product = products[indexPath.row] cell.textLabel!.text = product.name cell.accessoryType = product.selected ? .checkmark : .none return cell } 

Dans didSelect... basculer selected et recharger la ligne

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selected = products[indexPath.row].selected products[indexPath.row].selected = !selected tableView.reloadRows(at: [indexPath], with: .none) } 

Pour get tous les éléments sélectionnés est très facile, aussi.

 let selectedItems = products.filter{ $0.selected } 

ou get seulement les noms

 let selectedNames = products.filter{ $0.selected }.map{ $0.name } 

Il n'y a aucun besoin d'get des informations de la vue . Le controller obtient toujours les informations du model et utilise la source de données tableview et délègue pour mettre à jour la vue .

Si vous souhaitez transmettre des données à un autre controller de vue, passez les instances Product . Ils contiennent toutes les informations pertinentes.