简体   繁体   中英

How to add simple save-load functions to document-based Swift 3 app?

I'm studying Swift (for just a hobby) at the moment, and trying to figure out how I'm supposed to and save and load functions to document.swift file in document-based swift app? I'd like to know how to save and load simple txt-files. I'm using NSTextView, so I guess I have to change that to NSString?

Here are those functions at the moment:

override func data(ofType typeName: String) throws -> Data {
        // Insert code here to write your document to data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning nil.
        // You can also choose to override fileWrapperOfType:error:, writeToURL:ofType:error:, or writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)      
    }

override func read(from data: Data, ofType typeName: String) throws {
        // Insert code here to read your document from the given data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning false.
        // You can also choose to override readFromFileWrapper:ofType:error: or readFromURL:ofType:error: instead.
        // If you override either of these, you should also override -isEntireFileLoaded to return false if the contents are lazily loaded.
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)

    }

In you document.swift file these functions below will load and set your text views string value.

Hope this helps!

var content = ""
override func makeWindowControllers() {
    //Make the window controller
    let storyboard = NSStoryboard(name: "Main", bundle: nil)
    let windowController = storyboard.instantiateController(withIdentifier: "Document Window Controller") as! NSWindowController
    self.addWindowController(windowController)

    //Access the view controller
    let vc = windowController.contentViewController as! ViewController
    //Set the text view string to the variable that was loaded
    vc.textView.string = content
}

override func data(ofType typeName: String) throws -> Data {
    //Access the current view controller
    if let vc = self.windowControllers[0].contentViewController as? ViewController {
        //Get the textView's String Value; or call a function that will create a string of what needs to be saved
        return vc.textView.string?.data(using: String.Encoding.utf8) ?? Data()
    }else {
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }
}

override func read(from url: URL, ofType typeName: String) throws {
    do {
        //Set a string variable to the loaded string
        //We can't directly set the text views string value because this function is called before the makeWindowControllers() so now text view is created yet.
        content = try String(contentsOf: url, encoding: String.Encoding.utf8)
    }catch {
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }
}

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