IPB

Bienvenue invité ( Connexion | Inscription )

> [Swift] NSTableView et NSDocument, Comment sauvegarder les données ?
Options
olivion
posté 8 May 2019, 03:07
Message #1


Adepte de Macbidouille
*

Groupe : Membres
Messages : 192
Inscrit : 15 May 2005
Lieu : Buenos Aires - Argentina
Membre no 39 263



Bonjour à tous,

pour une application MacOS que je voudrais programmer, je cherche à placer une (plusieurs) tableView dans un NSDocument.
Dans le StoryBoard, dans la fenêtre document, je fais le lien entre la tableView et un ArrayController. Tout ça fonctionne correctement.

Ce que je n'arrive pas à faire, c'est la sauvegarde des données du document, et donc des données de la TableView.

Quelqu'un aurait-il un lien vers un tutoriel qui explique comment faire? J'ai beau chercher sur Google, je n'ai pas réussi à trouver quelque chose qui me satisfasse.

Merci d'avance...


--------------------
MacBook Air 13'', 8Go RAM, 256 Go / MacBook Pro, 8Go RAM, 500Go / — MacMini Intel (2006), 2Go RAM, 500Go
Go to the top of the page
 
+Quote Post
 
Start new topic
Réponse(s)
olivion
posté 13 May 2019, 00:03
Message #2


Adepte de Macbidouille
*

Groupe : Membres
Messages : 192
Inscrit : 15 May 2005
Lieu : Buenos Aires - Argentina
Membre no 39 263



Je continue sur ma lancée parce que je suis confronté à une erreur qui semble être une erreur d'encodage. Comme je l'avais montré dans les messages précédents, ma structure Sound a un attribut fileUrl, que je passe en String. Ma tableView ne l'affiche pas mais l'attribut est bien présent dans la datasource.
Quand je sauvegarde mon document, tout va bien. Quand j'ouvre un document tout va bien et les données de chaque Sound apparaissent bien dans la table. Avec un print dans la console, je peux voir que l'attribut fileUrl est correct aussi.

Dans un autre endroit de mon interface, j'affiche les détails qui ne sont pas dans la table lorsque je sélectionne une ligne. Le soundAsset me sert à déterminer la longueur du son qui est associé au fichier dans la fileUrl.

Code
func tableViewSelectionDidChange(_ notification: Notification) {
        let row = soundTableView.selectedRow
        
        if row != -1 {
            let sound = sounds[row]
            let soundAsset = AVURLAsset(url: URL(string: sound.fileUrl)!)
  
            durationField.stringValue = formatTime(time: CMTimeGetSeconds(soundAsset.duration))
            beginsAtTextField.stringValue = formatTime(time: sound.beginsAt)
            endsAtTextField.stringValue = formatTime(time: sound.endsAt)
        }
    }


Lorsque j'aboute un enregistrement à ma table, tout fonctionne parfaitement.
Code
        let resultat = openPanel.runModal()
        if resultat == NSApplication.ModalResponse.OK {
            guard let fileUrl = openPanel.url else { return }
            
            var idMax = 0
            for sound in sounds {
                idMax = max(sound.id, idMax)
            }
            let displayName:  String = fileUrl.deletingPathExtension().lastPathComponent
            let soundAsset: AVURLAsset = AVURLAsset(url: fileUrl)
            let endsAt = CMTimeGetSeconds(soundAsset.duration)
            let sound: Sound = Sound(id: idMax + 1, name: displayName, fileUrl: fileUrl.absoluteString, beginsAt: 0.0, endsAt: endsAt)
            }
            
            sounds.append(sound)
            
            soundTableView.reloadData()
        }

Si après avoir ajouté un élément à la table, je clique sur sa ligne, je vois apparaître la longueur du son dans le champ durationField.

Par contre, si j'ouvre un fichier précédemment sauvegardé, et alors que le fileUrl apparaît correctement comme attribut, le temps affiché dans durationField est égal à zéro. C'est à dire que dans un document ouvert, le fileUrl de mon soundAsset ne trouve pas le, fichier.
Si je rajoute alors le même fichier dans ma table, un clic sur la nouvelle ligne affiche le temps correct, et un clic sur l'ancienne ligne affiche le temps correct aussi.

Qu'est-ce que je peux bien avoir fait de mal? L'encodage est fait sur un String, pas directement sur l'Url. Je ne vois pas...


--------------------
MacBook Air 13'', 8Go RAM, 256 Go / MacBook Pro, 8Go RAM, 500Go / — MacMini Intel (2006), 2Go RAM, 500Go
Go to the top of the page
 
+Quote Post

Les messages de ce sujet


Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 18th July 2025 - 11:10