Aide Setting Bundle

#1

Bonjour, j’ai besoins de vos lumière concernant mes Settings Bundle.

Dans mon application j’ai utilisé les Setting Bundle qui permet d’avoir des paramètres. J’ai créer une paramètre qui d’appel extra. quand le mot magique et inscrit il permet de faire apparaitre une section de ma tableview.

En faisant mes essaies j’arrive a masqué la section adéquate. J’arrive a changer la couleur quand je tape le mot magique ou il faut.

j’ai donc besoin de vos lumière pour me permettre de changer le “return true ” en “return false” dans ma sectionShouldBeHidden depuis ma func extraChange

Je vous met le code complet

import UIKit

class MenuController: UITableViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        registerSettingBundle()
        NotificationCenter.default.addObserver(self, selector: #selector(MenuController.extraChange), name: UserDefaults.didChangeNotification, object: nil)
//        self.tableView.backgroundColor = UIColor.blue
        
    }
    
    func registerSettingBundle() {
        let appDefaults = [String:AnyObject]()
        UserDefaults.standard.register(defaults: appDefaults)
    }
    
    @objc func extraChange(){
        if (UserDefaults.standard.string(forKey: "SETTINGS_BUNDLE_EXTRA") != "motmagique") {
            self.tableView.backgroundColor = UIColor.green
        } else {
            self.tableView.backgroundColor = UIColor.blue
        }
    }
    
    func sectionShouldBeHidden(_ section: Int) -> Bool {
        switch section {
        case 2, 3: return true
        default: return false
        }
    }
    
    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if sectionShouldBeHidden(section) {
            return nil // Show nothing for the header of hidden sections
        } else {
            return super.tableView(tableView, titleForHeaderInSection: section) // Use the default header for other sections
        }
    }
    
    override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
        if sectionShouldBeHidden(section) {
            return nil
        } else {
            return super.tableView(tableView, titleForFooterInSection: section)
        }
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if sectionShouldBeHidden(section) {
            return 0 // Don't show any rows for hidden sections
        } else {
            return super.tableView(tableView, numberOfRowsInSection: section) // Use the default number of rows for other sections
        }
    }
    override public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        if sectionShouldBeHidden(section) {
            return CGFloat.leastNormalMagnitude // Use the smallest possible value for hidden sections
        } else {
            return super.tableView(tableView, heightForFooterInSection: section) // Use the default footer height for other sections
        }
    }
    
}

Merci d’avance

#2

Personne ne peut me mettre sur la voie car je suis bloqué :no_mouth:

#3

Hello Jef,

Je ne comprends pas vraiment ce que tu veux faire mais la fonction extraChange n’appelle jamais la fonction sectionShouldBeHidden() donc je ne vois pas comment tu penses récupérer ce que te renvoie cette fonction.
Ou alors, si tu pense le faire depuis la configuration de la TableView, il faut que tu appelles self.tableView.reloadData() après avoir paramétrer la couleur pour qu’il vérifie l’état de la section.

#4

Bonjour, en fait j’essaye de faire en sorte que quand le « mot magique » et entres dans les paramètres extraChange

La case 2 : return false

func sectionShouldBeHidden(_ section: Int) -> Bool {
switch section {
case 2, 3: return true
default: return false
}
}

Mais je ne voie pas comment faire ?

#5

En faisant dans ton switch :

case 2: return false
case 3: return true
default: return false

non ?

#6

Visiblement je n’arrive pas à formuler mes phrases pour me faire comprendre
Dans la fonction suivante :

Je souhaite faire passer case 2 en return false
Avec cette fonction ci :

Donc à la place de changer le background de couleurs celle-ci

@objc func extraChange(){
if (UserDefaults.standard.string(forKey: “SETTINGS_BUNDLE_EXTRA”) != “motmagique”) {
JE CHANGE CASE 2 EN FALSE
} else {
JE LAISSE CASE 2 EN TRUE
}
}

#7
//
//  ViewController.swift
//  testMotMagique
//
//  Created by Patrick Leclercq on 30/06/2019.
//  Copyright © 2019 patrick leclercq. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    
    // Constante contenant le mot magique
    let motMagique = "Zoumi"
    
    // Variable globale mémorisant
    // l'information sur la présence ou l'absence
    // du mot magique
    var presenceMotMagique = false

    override func viewDidLoad() {
        super.viewDidLoad()
        
        testerMotMagique()
        if presenceMotMagique {
            self.view.backgroundColor = UIColor.red
        } else {
            self.view.backgroundColor = UIColor.green
        }
    }
    
    func testerMotMagique() {
        if (UserDefaults.standard.string(forKey: "SETTING_BUNDLE_EXTRA") == motMagique) {
            presenceMotMagique = true
        } else {
            presenceMotMagique = false
        }
    }

}

L’idée c’est d’utiliser une variable globale pour mémoriser la présence ou l’absence du mot magique. D’autres écritures sont possibles, mais à ton niveau d’apprentissage c’est le plus simple.

#8

Et pour terminer :

func sectionShouldBeHidden(_ section: Int) -> Bool {
    testerMotMagique()
    switch section {
    case 2 : return presenceMotMagique
    case 3 : return true
    default: return false
    }
}

Il est aussi possible d’utiliser une formulation plus concise, en réalisant le test du mot magique, directement dans le switch-case, sans passer par une variable intermédiaire, ni une autre fonction.

func sectionShouldBeHidden(_ section: Int) -> Bool {
    switch section {
    case 2 : return UserDefaults.standard.string(forKey: "SETTING_BUNDLE_EXTRA") == motMagique
    case 3 : return true
    default: return false
    }
}

Ce n’est pas très lisible. Le code dans un switch-case doit être compréhensible au premier regard, plutôt que ressembler à un plat de spaghettis.

Le plus efficace c’est d’intégrer le test dans une fonction spécialisée retournant un Bool.

func testMotMagique()->Bool {
    let defaults = UserDefaults.standard
    return defaults.string(forKey: "SETTING_BUNDLE_EXTRA") == motMagique
}

Et de modifier le switch-case comme ça :

func sectionShouldBeHidden(_ section: Int) -> Bool {
    switch section {
    case 2 : return testMotMagique()
    case 3 : return true
    default: return false
    }
}
1 Like
#9

Merci pour t’est explication @Draken

Mon application peut avancer :wink: