iPhoneに忙しいビュー
-
28-09-2019 - |
質問
検索プロセス中に忙しいビューを表示しようとしていますが、表示されないようです。
私が達成しようとしていること
- ユーザーは、uisearchbarにテキストを入力したら、検索ボタンをクリックします。
- 入力されたテキストは、searchbarsearchbuttonclickedに委任されます。
- 検索が進行中であることを示すために、uiactivityindicatorViewを含むuiviewである「ビジービュー」を表示します。
- Webサイトと通信する検索を実行します。
- 検索完了時に「ビジービュー」を削除します。
どうしたの
検索プロセスは正常に動作しています。デバッガーを使用して、検索BarsearchButtonClicked関数を介して動いているのがわかりますが、「ビジービュー」が表示されません。検索には2〜3秒かかるので、理論的には2〜3秒間「ビジービュー」が表示されるのを見る必要があります。
コード試行1- 監督から「ビジービュー」を追加して削除**
- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {
[activeSearchBar setShowsCancelButton:NO animated:YES];
[activeSearchBar resignFirstResponder];
[busyView activateSpinner]; //start the spinner spinning
[self.view addSubview:busyView]; //show the BusyView
Search *search = [[Search alloc]init];
results = [search doSearch:activeSearchBar.text];
[busyView deactivateSpinner]; //Stop the spinner spinning
[busyView removeFromSuperview]; //remove the BusyView
[search release]; search = nil;
}
試みの結果1- ただし、RemosionFromsuperviewのコメントをコメントアウトすると、画面上にあるビジービューのままになります。
コード試行2- アニメーションを使用します
- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {
[activeSearchBar setShowsCancelButton:NO animated:YES];
[activeSearchBar resignFirstResponder];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop)];
[busyView activateSpinner]; //start spinning the spinner
[self.view addSubview:busyView]; //show the busy view
[UIView commitAnimations];
Search *search = [[Search alloc]init];
results = [search doSearch:activeSearchBar.text];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop)];
[busyView deactivateSpinner]; //sets stops the spinner spinning
[busyView removeFromSuperview]; //remove the view
[UIView commitAnimations];
[search release]; search = nil;
}
試みの結果2- 「ビジービュー」が表示されませんでした
解決
さて、これが私の解決策です:
- SingletonクラスMyLoadingViewを作成します。このクラスには、show and hide static Methodsが含まれている必要があります。
- MyLoadingViewコンストラクターでは、半透明の黒い背景とその内部にアクティビティビューを使用して、手動でビューを作成する必要があります。このビューをに配置します
[[UIApplication sharedApplication] keyWindow]
. 。それを隠します。 [MyLoadingView show]
Invocationは、MyLoadingViewオブジェクトをそのコンテナの前面にもたらすだけです。[[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:myLoadingViewSharedInstance];
. 。また、ActivityViewアニメーションを開始することを忘れないでください。[MyLoadingView hide]
ActivityViewアニメーションを停止し、HIDESHIDESINSTANCEVIEW。
呼び出す必要があることに注意してください [MyLoadingView show]
別のスレッドで。
他のヒント
ココアのUIの変更は、次にコードが実行ループにコントロールを返すときにのみ有効になります。検索タスクがメインスレッドで同期して実行される限り、UIの更新を含む実行をブロックします。
バックグラウンドで時間のかかるタスクを非同期に実行する必要があります。これにはいくつかのオプションがあります(NSOperation
, performSelectorInBackground:...
, 、グランドセントラルディスパッチ、...)。
所属していません StackOverflow