2016-08-16 2 views
1

メインウィンドウコントローラには、モーダルシートの表示をトリガするツールバー項目があります。シートは、長い非同期プロセスの進行状況を表示することになっています(たとえば、ローカルデータをサーバーと同期させるなど)。モーダルシートの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に接続された新しい参照アウトレットがあります。

しかし:(実行がブレークポイントで停止しないとログが印刷されません)

  1. SyncProgressWindowControllerさんwindowDidLoad()呼び出されません。
    self.syncProgressWindowController.progressIndicator.startAnimation(self)

私は何をしないのです。私はそれをアニメーション化しようとするとアプリが、このようなコードで、クラッシュしないので、それにもかかわらず

  • は、プロパティ/出口progressIndicatorは、何らかの形で設定されていますか?

  • 答えて

    1

    シートを閉じるときに完了ハンドラが実行されますendSheet(_:returnCode:)シートを閉じる前にインジケータを開始します。

    私はxibファイルがうまくないですが、loadWindowで行を無効にすると、windowDidLoadが呼び出されました。私はそれが正しい方法であるとは思わない。

    +0

    私は完了ハンドラについても考えていました。しかし、その中に置かれたブレークポイントは、シートが表示されているときと同じように実行を停止します(私はまだ解雇のコードを書いていませんでした)。私の質問で説明したように、他の機会で進捗インジケータをアニメートしようとしても失敗します。もう一度チェックして、それは呼ばれていない...何かを見逃しているに違いない。 –

    +0

    'loadWindow()'に関して、モーダルプレゼンテーションを動作させようとしていると思います。あなたはそれを削除すると 'windowDidLoad()'が呼ばれるようになり、今度はそこで進捗アニメーションを開始できます。ありがとう! –

    関連する問題