メインウィンドウコントローラには、モーダルシートの表示をトリガするツールバー項目があります。シートは、長い非同期プロセスの進行状況を表示することになっています(たとえば、ローカルデータをサーバーと同期させるなど)。モーダルシートのNSProgressIndicatorがアニメーション化しない
しかし、(不確定の)進捗インジケータをアニメーション化することができません。
これはモーダルシートをトリガーするアクションである。
@IBOutlet weak var progressIndicator: NSProgressIndicator!
convenience init() {
self.init(windowNibName: "SyncProgressWindow")
}
override func windowDidLoad() {
super.windowDidLoad()
// Breakpoints here don't work, logs don't print to the console.
// Not called? But outlet _is_ set (see above).
}
XIBファイル(SyncProgressWindow.xib:
var syncProgressWindowController: SyncProgressWindowController!
// ...
@IBAction func syncWithServer(_ sender: AnyObject) {
// (Actual HTTP code not implemented)
syncProgressWindowController = SyncProgressWindowController()
syncProgressWindowController.loadWindow()
guard let modalWindow = syncProgressWindowController.window else {
return
}
self.window?.beginSheet(modalWindow, completionHandler: { (response) in
// THIS GETS EXECUTED.
// However, the code below has no effect:
self.syncProgressWindowController.progressIndicator.startAnimation(self)
// self.syncProgressWindowController.progressIndicator is
// NOT nil, despite windowDidLoad() not being called
// (see below)
})
}
モーダルシートウィンドウコントローラ(クラス上記SyncProgressWindowController
)をこのように定義され)は次のとおりです。
- "SyncProgressWindowController"に設定されたファイルの所有者ID /クラス
- ウィンドウがオーナーの管理
window
- ウィンドウが
delegate
コンセントは、「ファイルの所有者」に有線たファイルに新しいの参照アウトレットを持っている(念のために - しかし、デリゲートメソッドは、どちらかと呼ばれ得るように見えることはありません)。 - ウィンドウに「表示開始時に表示」が選択されていないため、モーダルで問題なく表示されます。
- 進捗状況には、ファイルの所有者の
progressIndicator
に接続された新しい参照アウトレットがあります。
しかし:は(実行がブレークポイントで停止しないとログが印刷されません)
SyncProgressWindowController
さんwindowDidLoad()
呼び出されません。
self.syncProgressWindowController.progressIndicator.startAnimation(self)
私は何をしないのです。私はそれをアニメーション化しようとするとアプリが、このようなコードで、クラッシュしないので、それにもかかわらず
progressIndicator
は、何らかの形で設定されていますか?
私は完了ハンドラについても考えていました。しかし、その中に置かれたブレークポイントは、シートが表示されているときと同じように実行を停止します(私はまだ解雇のコードを書いていませんでした)。私の質問で説明したように、他の機会で進捗インジケータをアニメートしようとしても失敗します。もう一度チェックして、それは呼ばれていない...何かを見逃しているに違いない。 –
'loadWindow()'に関して、モーダルプレゼンテーションを動作させようとしていると思います。あなたはそれを削除すると 'windowDidLoad()'が呼ばれるようになり、今度はそこで進捗アニメーションを開始できます。ありがとう! –