13

Apple のドキュメントによると、「ウィジェットを最新の状態に保つために、システムは時々ウィジェットのビューのスナップショットをキャプチャします。ウィジェットが再び表示されると、システムがビューのライブ バージョンに置き換えるまで、最新のスナップショットが表示されます。 ."

しかし、私が見ているのは、ライブ ビューが準備される前に、スナップショットが画面から削除されていることです。これにより、古いスナップショットが画面から取り除かれ、ビューが一瞬空白になり、その後新しいビューが表示されるフラッシュ効果が発生します。

開発者は、スナップショットとライブ ビューの間の移行をシームレスにする責任がありますか? もしそうなら、その背後にある戦略は何ですか?その遷移を直接制御する方法はありません。

データの読み込みを widgetPerformUpdateWithCompletionHandler: に移動し、viewWillAppear: で描画を維持することで、影響を大幅に軽減できましたが、通知センターが 15 回 (またはそれくらい) 開くたびに、まだフラッシュが表示されます。

4

2 に答える 2

27

私はこれと同じ問題を抱えていましたが、ついにウィジェットで発生していた問題を突き止めました。私の代わりに、ウィジェットのライフサイクルに関する誤解に関連していたことが判明しました。

widgetPerformUpdateWithCompletionHandlerドキュメントから、今日のビューは、メソッド完了ハンドラーが正常に呼び出されるまで、ウィジェットの状態の「スナップショット」を保持すると考えました。

そうではないようです。私が見ることができるものから、「スナップショット」は、Today View がアニメーション化されているとき (ユーザーが通知センターをプルダウンしたとき) にのみ使用されます。今日のビューがロードされ静止するとすぐに、ウィジェットが最初からロードされ (使用している場合は xib から膨張)、viewDidLoad呼び出されます。この時点で、(Web 要求からではなく) キャッシュされたデータをウィジェットに入力する必要があります。そうしないと、ペン先の一時データが表示されます。これが点滅の原因です。

When viewDidLoadis completewidgetPerformUpdateWithCompletionHandlerが呼び出され、新しいデータを取得できます。新しいデータがフェッチされたら、完了ハンドラーを呼び出してデータをキャッシュする必要があります。これにより、ウィジェットが後でゼロからロードされるときに使用できるようになります ( viewDidLoad)。

データをキャッシュする簡単な方法は、ユーザーのデフォルトです。

于 2015-02-20T22:53:07.610 に答える
2

のコンパイル ハンドラに注意する必要があります。

-(void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler

方法。拡張機能におそらくエラーがあり、ビューが表示されるたびに再度呼び出されます。拡張機能をデバッガーにアタッチし (Debugger->Attach to Process-> your extension id)、いくつかのブレークポイントを配置して結果を確認してください。

于 2014-10-23T08:09:23.507 に答える