0
votes

Comment afficher un message d'erreur lors de la sélection d'une ligne dans une section différente

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

        }

    }


7 commentaires

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 :) . À l'intérieur, récupérez les cellules sélectionnées avec indexpathsforselectedwows . 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.


4 Réponses :


0
votes

De ce que je comprends, vous pouvez faire ce qui suit:

  1. Ajoutez une valeur BOOL sur votre section STRIT pour vérifier si vous avez un élément sélectionné xxx
    1. Changer votre DisSelectrowat xxx

      J'espère que je vous ai aidé


0 commentaires

0
votes

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
}


0 commentaires

0
votes

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
}


0 commentaires

1
votes

Mettre en œuvre UitailViewelegate Méthode TableView (_: WillSelectrowat :) .

Utilisez Carte (_:) > Pour obtenir les sections à partir de indexpathsforselecteRows .

Vérifiez si la section dans dans dans < Code> TableView (_: WillSelectrowat :) est contenu dans les sections Objets précédemment obtenues UTILISER Contient (_:) xxx

tableView (_: WillSelectrowat :) Valeur de retour: un objet de chemin d'index qui confirme ou modifie la ligne sélectionnée. Renvoyer un objet nsindexpath autre que Indexpath si vous voulez que une autre cellule soit sélectionnée. Revenir nil si vous ne voulez pas la ligne sélectionnée.


0 commentaires