Bienvenue invité ( Connexion | Inscription )
8 May 2019, 03:07
Message
#1
|
|
![]() Adepte de Macbidouille ![]() Groupe : Validating 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
|
|
|
|
![]() |
21 May 2019, 11:23
Message
#2
|
|
![]() Adepte de Macbidouille ![]() Groupe : Validating Messages : 192 Inscrit : 15 May 2005 Lieu : Buenos Aires - Argentina Membre no 39 263 |
Bon, j'ai eu ma solution. Le problème de lecture d'un fichier externe mp3 tient au sandboxing de toute application.
Lorsqu'on rajoute un fichier à ma table via NSOpenPanel, l'utilisateur donne un droit implicite à la lecture du fichier, donc pas de problème. Mais quand on charge le fichier de sauvegarde, on ne donne pas le droit en question. Au lieu de conserver simplement le path ou l'Url, il faut donc passer par une URL sécurisée (security scoped). On crée un Bookmark à partir de l'Url, et au moment du chargement du document, on recrée les Url à partir du Bookmark, afin de récupérer le droit à l'accès aux fichiers externes associés. Je ne suis pas sûr et certain à 100% de la qualité de mon code à ce niveau mais ça fonctionne. J'ai écrit le code en fonction de ce que j'ai compris. Donc j'ai rajouté à ma classe sound un attribut "bmUrl: Data" (comme BookmarkURL du type Data). Dans ma fonction @IBAction func addSound():, après avoir récupéré l'URL du fichier sélectionné, je crée le BookMark: Code let bmUrl = try! fileUrl.bookmarkData(options: .securityScopeAllowOnlyReadAccess, includingResourceValuesForKeys: nil, relativeTo: nil) Je ne touche pas aux fonctions d'encodage et décodage de Document.swift. Code override func data(ofType typeName: String) throws -> Data { if let content = soundViewController?.sounds { let encodedData = try! JSONEncoder().encode(content) return encodedData } throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) } override func read(from data: Data, ofType typeName: String) throws { guard let decodedData = try! JSONDecoder().decode([Sound]?.self, from: data) else { throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) } sounds = decodedData } Dans ma classe SoundViewController, je réinitialise les droits d'accès: Code override func viewDidAppear() { sounds = document.sounds ?? [] var isStale = false for sound in sounds{ _ = try? URL.init(resolvingBookmarkData: sound.bmUrl, options: URL.BookmarkResolutionOptions.withSecurityScope, relativeTo: nil, bookmarkDataIsStale: &isStale) } soundTableView.reloadData() } La variable isStale est retournée comme true si tout se passe bien. Comme je sauvegarde aussi le lien décodé, je n'ai pas vraiment besoin de recréer complètement le lien. D'où le _ au lieu d'un sound.fileUrl = ... La ligne de code redonne donc le droit d'accès au fichier. Problème posé le 12 mai, et résolu le 20. 9 jours à m'arracher les cheveux. Donc je laisse ce petit témoignage pour le cas où ça servirait à quelqu'un -------------------- MacBook Air 13'', 8Go RAM, 256 Go / MacBook Pro, 8Go RAM, 500Go / MacMini Intel (2006), 2Go RAM, 500Go
|
|
|
|
olivion [Swift] NSTableView et NSDocument 8 May 2019, 03:07
schlum Code override func data(ofType typeName: S... 9 May 2019, 00:54
olivion Merci beaucoup pour la réponse. En fait j'ava... 9 May 2019, 14:53
schlum Normal, tu envoies une exception systématiquement... 10 May 2019, 19:40
olivion Il y a des jours comme ça où on se sent très b�... 11 May 2019, 21:10
olivion Je continue sur ma lancée parce que je suis confr... 13 May 2019, 00:03
schlum Je ne vois pas… Essaye avec NSKeyedArchiver / NS... 13 May 2019, 01:53
olivion Merci Schlum de ta réponse. Comme j'ai du mal... 15 May 2019, 02:17
olivion Je précise un peu plus mes recherches sur le suje... 15 May 2019, 12:43
schlum Désolé, pas eu les notifications de réponses…... 25 May 2019, 00:59
olivion Salut Schlum. En fait, c'est pas complètement... 25 May 2019, 03:48
schlum Tu as vu cette technote d’Apple (section « Sec... 27 May 2019, 08:56
olivion Merci, mais oui, j'avais vu. Et mon problème ... 27 May 2019, 12:11![]() ![]() |
| Nous sommes le : 1st May 2026 - 21:33 |