これに多くの時間を費やしてきましたが、完璧な解決策を見つけることができません。
たくさんのアイテムを含むテーブル ビューを持つアプリを作成しています。項目をクリックすると、Web ページを含む Webview コントローラーが開きます。このビューには [戻る] ボタンがあります。
これらのアイテムのデータは、作成した API を介して取得します。これには時間がかかる場合があるため、アイテムが API から読み込まれている間、読み込み画面が必要です。ただし、アイテムが同期され、最後に同期された時間が X 時間を超えていない場合は、API 呼び出しを実行するのではなく、コア データ (API 呼び出し後に格納されている場所) から取得する必要があります。
今、ロード画面で悩んでいます。いくつかの要件:
- データを同期する必要がある場合は、読み込み画面が直接表示されます。
- アプリの起動時、または
- Webview の戻るボタンをクリックしたとき、または
- アプリはバックグラウンドに配置され、テーブル ビューをアクティブ ビューとしてフォアグラウンドに再び表示されます
- データを同期する必要がない場合は、前のポイントと同じ状況でテーブル ビューを直接表示する必要があります。
- ローディング画面からTable Viewへの遷移アニメーションはCross Dissolveにする必要があります。
ロード画面に写真付きのスライダーを持たせる予定なので、オーバーレイ画像だけではいけません
私は最初に次のように試しました:
ここで、ローディング画面は、Navigation Controller の後の最初のビューです。データが同期されている場合は、テーブル ビューへのセグエを呼び出します ( viewWillAppear
)。データが同期されていない場合は、同期されるまで待機します。Table View ControllerのviewWillAppear
メソッドでは、同期を行う必要があるかどうかもチェックします (Webview から戻った場合、またはアプリがフォアグラウンドになった場合[self.navigationController popViewControllerAnimated:NO]
)。
これはうまく機能し、Webview から読み込み画面へのアニメーションはスムーズに進み、その間に Table View は表示されません。でもアニメーションはプッシュなので修正できません。そのため、ディゾルブ アニメーションを使用できません。
だから私は別のアプローチを試みました:
ここでは、モーダル セグエを作成しました。Table View からローディング画面へのアニメーションは無効にし、ローディング画面から Navigation Controller へのアニメーションは Cross Dissolve トランジションにしました。そうしないと、Table ViewにNavigation Controllerがないため、Navigation Controllerに戻る必要があります。
テーブル ビューで、データを同期する必要があるかどうかを再度確認し、同期する必要がある場合は、読み込み画面に移動します。ただし、今回viewDidAppear
はロード画面がまだ に表示されていないため、これを行う必要がありviewWillAppear
ます。アプリをバックグラウンドにすると警告がスローされ、X 時間が経過するまで待って (同期するため)、アプリを再びフォアグラウンドに。これは私が得る警告です:
Warning: Attempt to present <BWLoadingScreenViewController: 0x829e2b0> on <UINavigationController: 0x856a6b0> whose view is not in the window hierarchy!
だから私は使用viewDidAppear
し、警告はありませんが、この方法には欠点もあります:
- Webview から戻って X 時間が経過すると (同期されるため)、プッシュ アニメーションが最初に Table View に移動し、次に読み込み画面に点滅します。かなり醜いです...
もちろん、手動のセグエをあらゆる場所で使用できます。各セグエの前に、データを同期する必要があるかどうかを確認し、同期する必要がある場合は、他の画面ではなくロード画面にセグエしますが、そのような単純なことではかなり複雑になります。また、同期を行う必要があるかどうかを確認し、読み込み画面を表示するかどうかを確認する 1 つの普遍的な場所が必要です。
このジレンマをきれいに解決する方法を知っている人はいますか? 提案は大歓迎です。私はまだiOS開発にかなり慣れていないので、新しい洞察を教えてくれるかもしれません。私のセットアップに関する詳細情報が必要な場合は、私に尋ねてください。