简体   繁体   中英

How do I save multiple files in a package folder from a SwiftUI Document Based App?

I'm developing a SwiftUI document-based app that contains some easily serializable data plus multiple images. I'd like to save the document as a package (ie, a folder) with one file containing the easily serialized data and a subfolder containing the images as separate files. My package directory should look something like this:

 <UserChosenName.pspkg>/.    // directory package containing my document data and images
       PhraseSet.dat   // regular file with serialized data from snapshot
       Images/              // subdirectory for images (populated directly from my app as needed)
             Image0.png
             Image1.png
             ....

I've created a FileWrapper subclass that sets up the directory structure and adds the serialized snapshot appropriately but when I run the app in an iOS simulator and click on "+" to create a new document the app runs through the PkgFileWrapper init() and write() without error but returns to the browser window without apparently creating anything. I have declared that the Exported and Imported Type Identifiers conform to "com.apple.package". Can anyone suggest a way to get this working?

The PkgFileWrapper class looks like this:

class PkgFileWrapper: FileWrapper {

var snapshot: Data

init(withSnapshot: Data) {
    self.snapshot = withSnapshot
    let sWrapper = FileWrapper(regularFileWithContents: snapshot)
    let dWrapper = FileWrapper(directoryWithFileWrappers: [:])
    super.init(directoryWithFileWrappers: ["PhraseSet.dat" : sWrapper,
                                           "Images" : dWrapper ])
    
    // NOTE: Writing of images is done outside
    // of the ReferenceFileDocument functionality.
}
    
override func write(to url: URL,
                    options: FileWrapper.WritingOptions = [],
                    originalContentsURL: URL?) throws  {
    if let fileWrappers = fileWrappers {
        for (_, wrapper) in fileWrappers {
            try wrapper.write(to: url, options: options,
                              originalContentsURL: originalContentsURL)
        }
    }
}

required init?(coder inCoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

The solution is to not override the PkgFileWrapper.write(...). If the directory structure is set up correctly in the init(...) then the files and directories will be created automatically. The overridden write(...) function above uses the urls incorrectly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM