問題タブ [nsapplication-delegate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - ViewController クラスでアプリを起動したファイルの名前を取得しますか?
ダブルクリックして macOS アプリ (Swift 4.x) を起動するファイルの名前を取得するNSApplicationDelegate
メソッドを実装しました。func application(_ sender: NSApplication, openFile filename: String) -> Bool
ただし、このメソッドが呼び出された後ViewController viewDidLoad()
、すべての初期化コードが実行されるようです。初期化コードでファイル名を直接利用できるようviewDidLoad()
に、クラスでファイル名を取得する方法はありますか?ViewController
アップデート:
AppDelegate
Swift 4.2 のこのリンクからの提案にViewController
基づいて、データを から に渡すことができるようになりました。
したがって、私の質問は、ファイル名を直接取得する方法、ViewDidLoad()
または名前を取得して、呼び出されたときapplication(_, sender: NSApplication, openFile filename: String) -> Bool
に渡すことができるようにする方法です。ViewController
ViewDidLoad()
cocoa - アプリが終了する/ウィンドウが閉じる前に、NSDocument に最後の変更を加えますか?
基本的な NSDocument ベースのアプリがあります。次の場合、ドキュメントに最後の変更を加える必要があります。
- ユーザーがドキュメントのウィンドウを閉じる
- ユーザーがアプリを終了する
なんで?
ドキュメント ウィンドウには NSTextField が含まれています。通常、このテキスト フィールドに入力されたテキストは、ユーザーが ( 経由でtextDidEndEditing(_:)
) Enter キーを押した後、ドキュメントのモデルにコミットされます。
ユーザーがテキストを入力したが、Enter キーを押さなかったとします。代わりに、Cmd-W または Cmd-Q を押して、ドキュメント ウィンドウを閉じるか、アプリを完全に終了します。
textDidEndEditing
は呼び出されないので、テキスト フィールドに変更が含まれているかどうかを確認し、自分でドキュメントを更新しようとします。
❌ ここが難しいところです。次の場合、 でデッドロックが発生しNSDocument.performActivityWithSynchonousWaiting
ます。
にフックするのではなく、 にフックすることで、デッドロックを回避することができviewWillDisappear
ましたNSDocument.canClose(withDelegate delegate: Any, shouldClose shouldCloseSelector: Selector?, contextInfo: UnsafeMutableRawPointer?)
。
✅ このコードにより、ユーザーがドキュメント ウィンドウを閉じたときに変更が保存されます。
.
❓残念ながら、上記はユーザーがアプリを終了したときに呼び出されません。--でドキュメントを更新しようとしましたが、うまくいきapplicationWillTerminate()
ませんでした。また、終了をオーバーライドapplicationShouldTerminate()
して 3 秒間遅らせてみました。ドキュメントのウィンドウが「編集済み」としてマークされているのがわかりますが、変更は保存されません。
アプリが終了する直前に NSDocument に最後の変更を加えて、自動的に保存するにはどうすればよいですか?