essentiellement, j'ai une vision de table séparée par des sections.
La TableView permet de sélectionner plusieurs lignes et affiche un accessoire .Checkmark sur toutes les lignes sélectionnées. p>
Si l'utilisateur commence à sélectionner des lignes sous Une section et essayez de sélectionner une ligne différente sous un différent que j'aimerais que un message d'alerte apparaisse et que la sélection ne soit pas effectuée. p>
Ce qui suit est le code jusqu'à présent: P>
import UIKit
class TableViewController: UITableViewController {
var Name = UserDefaults.standard.string(forKey: "name")!
var sections = [Section]()
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellId")
navigationController?.navigationBar.prefersLargeTitles = true
fetchJSON()
self.tableView.allowsMultipleSelection = true
}
}
4 Réponses :
De ce que je comprends, vous pouvez faire ce qui suit:
DisSelectrowat CODE> LI>
ol> xxx pré> J'espère que je vous ai aidé p> p>
Vérifiez TableView (_: WillSelectrowat :) . Vous pouvez retourner nul de cette méthode de déléguée pour empêcher une ligne d'être sélectionnée.
override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if let
indexPathsForSelectedRows = tableView.indexPathsForSelectedRows, indexPathsForSelectedRows.count > 0,
indexPath.section != indexPathsForSelectedRows[0].section
{
// If there is at least one row already selected
// And the section of that row is different than the section of the row about to be selected
// Don't allow the selection
let alertController = UIAlertController(title: "Whoops!", message: "Don't do that!", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Okay", style: .default, handler: nil))
present(alertController, animated: true, completion: nil)
return nil
}
// There's either nothing selected yet or the section of this row is the same as those already selected
return indexPath
}
Je pense que vous devez créer une logique supplémentaire pour cela, par exemple. Vous pouvez mettre en une seule array que vous avez sélectionné et comparer toujours le premier élément (IndexPath) avec chaque élément que vous allez ajouter à Ajouter, la section IndustryPath contient la section de la propriété qu'il suffit de comparer si la section est égale ou non, si Il n'est pas, vous affichez de votre alerte que vous voulez, après cela, vous désélectionnez l'article manuellement.
var selectedItems = [IndexPath]()
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let firstIndexPath = selectedItems.first{
//If the section with the first element selected and the new selection are not equals, display your message
if indexPath.section != firstIndexPath.section{
let alert = UIAlertController(title: "Warning", message: "Message", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: {
a in
self.selectIndexPath(indexPath: indexPath, isSelected: false)
}))
//You can put it here if you prefer not wait for the closure for realize the deselection
//self.selectIndexPath(indexPath: indexPath, isSelected: false)
self.present(alert, animated: true, completion: nil)
return
}
self.selectIndexPath(indexPath: indexPath, isSelected: true)
}else{
self.selectIndexPath(indexPath: indexPath, isSelected: true)
}
}
func selectIndexPath(indexPath: IndexPath, isSelected: Bool){
tableView.cellForRow(at: indexPath)?.accessoryType = isSelected ? .checkmark : .none
if isSelected{
selectedItems.append(indexPath)
}else{
selectedItems.removeAll(where: {$0 == indexPath})
tableView.deselectRow(at: indexPath, animated: true)
}
let section = sections[indexPath.section]
let item = section.items[indexPath.row]
// for all selected rows assuming tableView.allowsMultipleSelection = true
}
Mettre en œuvre Utilisez Vérifiez si la section code> code> code> code> dans code> dans code> dans < Code> TableView (_: WillSelectrowat :) code> est contenu dans les sections UitailViewelegate code> Méthode TableView (_: WillSelectrowat :) code>. Carte (_:) CODE> > Pour obtenir les sections code> à partir de indexpathsforselecteRows code>. p> Objets précédemment obtenues CODE> CODE> CODE> UTILISER Contient (_:) Code > strong> p>
NE POST POST POST CODE COMPLÉMENTAIRE JUSTE Code associé Man. Vous pouvez avoir une valeur de bool dans votre réseau de seccion pour vérifier où est la section [section] tout est vrai.
Je suis un peu inconnue avec comment faire ça, pouvez-vous me montrer s'il vous plaît?
Postez votre code de modèle
@kjoe s'il vous plaît voir ma mise à jour
@kjoe es-tu là?
Je verrai que je dois sortir dans un moment je fais une réponse
Implémenter
TableView (_: WillSelectrowat :) code>. À l'intérieur, récupérez les cellules sélectionnées avecindexpathsforselectedwows code>. Récupérez toutes les sections de Theses IndexPathes. Vérifiez si celui qui sera sélectionné est le même. Sinon, affichez une alerte, renvoyez NIL pour éviter la sélection. Si c'est le cas, renvoyez la indénitude.