> On Mar 6, 2017, at 7:05 PM, Daryle Walker <dary...@mac.com> wrote: > > >> On Mar 6, 2017, at 4:58 PM, Daryle Walker <dary...@mac.com> wrote: >> >> The docs fo “NSDocumentController.reopenDocument(for: withContentsOf: >> display: completionHandler:)” mention it’s for app restore. It ultimately >> calls “NSDocument.init(for: withContentsOf: ofType:)”, which mentions >> autosaved documents. Do I have to restrict these methods for their >> documented purposes? Or can I use them for general code, like an >> import-document function? They look perfect; they load in a file’s data to a >> new document, but leave the document’s file-identity anonymous afterwards. > > I tried: > >> extension DocumentController { >> >> /** >> An action method called by the Import command, it runs the modal Open >> panel and, based on the selected filenames, creates one or more `NSDocument` >> objects from the contents of the files, but stripping the file identities. >> >> The method adds the newly created objects to the list of `NSDocument` >> objects managed by the document controller. This method calls >> `reopenDocument(for:withContentsOf:display:completionHandler:)`, which >> actually creates the `NSDocument` objects. The first parameter is set to >> `nil`, meaning the documents are initialized with the source data, but they >> don't point back to said source. >> */ >> @IBAction func newDocumentFrom(_ sender: Any?) { >> self.beginOpenPanel { >> guard let files = $0 else { return } >> >> for file in files { >> self.reopenDocument(for: nil, withContentsOf: file, display: >> true) { >> if let error = $2 { >> self.presentError(error) // Ignore if recovery was >> done. >> } >> print("Document: \($0); Already open: \($1); Error: >> \($2)") >> } >> } >> } >> } >> >> } > > Do not do this. > > 1. When I load a file with normal open, then try my import action above, no > new window appears because the document has already been open once. > 2. When my import was the first action on the file, there is a window with > that document’s data. But the file DISAPPEARS from the Finder! I guess using > these functions not as planned marked the file as temporary and cleared it. > > Since I already created a NSDocumentController subclass, I could do it right. > Maybe I first call the regular open functionality, then: > > A. If the document already exists, make a new unconnected copy with Duplicate. > B. If the document didn’t exist, strip the file-URL and old file-name.
I actually unconditionally duplicate the loaded document and remove the first one if it wasn’t already open: > @IBAction func newDocumentFrom(_ sender: Any?) { > self.tryingImport = true > self.beginOpenPanel { possibleFiles in > self.tryingImport = false > guard let files = possibleFiles else { return } > > for file in files { > self.imports.append(file) > self.openDocument(withContentsOf: file, display: false) { > possibleDocument, alreadyOpen, possibleError in > if let error = possibleError { > self.presentError(error) // Ignore any recovery > } > if alreadyOpen { > self.imports.remove(at: self.imports.index(of: file)!) > } > if let document = possibleDocument { > do { > try self.duplicateDocument(withContentsOf: file, > copying: true, displayName: document.displayName) > } catch { > self.presentError(error) // Ignore any recovery > } > if !alreadyOpen { > document.close() > } > } > } > } > } > } It seems to be working so far. I have overrides of “addDocument” to not work if the file is in self.imports and of “runModalOpenPanel” to watch self.tryingImport and change the OK button accordingly (from “Open” to “Import”). — Daryle Walker Mac, Internet, and Video Game Junkie darylew AT mac DOT com _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com