[UITableView] modification du contenu des cells après création et affichage.
Bonjour à tous.
Pour mon travail de fin d'études j'écris une application qui permet d'aider à gérer la prise médicamenteuse lors de traitement de moyenne à longue durée.
Je ne vais pas plus rentrer dans les détails mais l'utilisateur devant être capable de consulter toute la base de donnée des médicaments vendus en Belgique je me suis tourné vers le CBIP qui ne propose pas d'accès en ligne via API ou serveur SQL mais propose un dump complet de leur db actualisée chaque chaque mois. Tout logiquement j'ai traité et envoyé ces données dans une base CloudKit parce que c'est gratos et relativement simple.
Pour les données j'ai modélisé selon les recommandations d'Apple : avec du back-referencing. J'ai une type de records nommé Drug qui contient les noms des médicaments et Maker avec tous les noms des fabricants. Logiquement un record Drug a une référence à un record Maker.
J'ai d'abord codé un importateur de données qui fait le lien entre une base Postgre et CloudKit. J'y ai aussi codé un petit panel qui permet de tester la recherche depuis le cloud.
Le modus operandi est simple l'utilisateur commence à taper le nom du médicament et la recherche se fait. Une fois qu'on reçoit les résultats on les affiche et on lance une requête pour afficher les noms des fabricants qui sera ensuite renseigné et affiché :
Sous macOS c'est super simple avec les bindings, les données sont aussi simples que ça:
class DrugData: NSObject {
let name: String
let id: CKRecordID
dynamic var makerName: String?
dynamic var fetching: Bool {
return makerName == nil
}
init(name: String, id: CKRecordID) {
self.name = name
self.id = id
}
override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> {
switch key {
case "fetching":
return Set<String>(["makerName"])
default:
return super.keyPathsForValuesAffectingValue(forKey: key)
}
}
}
et le NSArrayController fait le reste.
Mais sous iOS ? Jusque là j'ai une UITableView qui se rempli sans le spinner central qui ne veut désespérément pas s'afficher. Mais pire je n'arrive pas supprimer les spinners qui s'affichent en lieu et place du nom du fabricant et faire apparaitre ce dernier...
J'ai comme l'impression que ça va se régler à coup de KVO tout ça mais je ne sais pas qui notifier: le view controller ? la cell (il se passe avec le reuse ?)? un autre objet special pour l'occasion ?
J'ai une bonne expérience du développement mac mais je suis vraiment novice en développement iOS avec peu de temps devant moi pour devenir un développer acceptable. Mais je pense qu'ici j'aurai toute l'aide qu'il me faut
Réponses
Pour le gros spinner central, il y a ce genre de composants dispo sur CocoaControls/GitHub/CocoaPods en faisant un recherche sur HUD, tu devrais trouver ton bonheur.
Pour le spinner à l'intérieur des cells, c'est parce que tu fais un chargement en deux fois asynchrone (une première fois le nom du médoc et une deuxième pour le nom du labo ?) ?
Je dirais que tu pourrais faire un block sur la cellule, de la même manière qu'on a un chargement d'image sur une cell avec SDWebImage par exemple (y'a plein d'exemples sur le web).