1

検索プロセス中にビジー ビューを表示しようとしていますが、表示されないようです。

私が達成しようとしていること

  1. ユーザーは、UISearchBar にテキストを入力した後、検索ボタンをクリックします。
  2. 入力されたテキストは、searchBarSearchButtonClicked に委譲されます。
  3. 検索が進行中であることを示す UIActivityIndi​​catorView を含む UIView である「ビジー ビュー」を表示します。
  4. Web サイトと通信する検索を実行します。
  5. 検索が完了したら、「Busy View」を削除します。

どうしたの

検索プロセスは正常に機能しています。デバッガーを使用すると、searchBarSearchButtonClicked 関数を正常に通過していることがわかりますが、「ビジー ビュー」は表示されません。検索には 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 -表示されませんが、removeFromSuperview 呼び出しをコメントアウトすると、ビジー ビューが画面に残ります。


コード試行 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 の結果 -「ビジー ビュー」が表示されませんでした

4

2 に答える 2

1

さて、これが私の解決策です:

  • シングルトン クラス MyLoadingView を作成します。このクラスには、show および hide 静的メソッドが含まれている必要があります。
  • MyLoadingView コンストラクターでは、半透明の黒い背景とその中に activityview を持つビューを手動で作成する必要があります。このビューを に配置します[[UIApplication sharedApplication] keyWindow]。隠します。
  • [MyLoadingView show]呼び出しは、 myLoadingView オブジェクトをそのコンテナーの前面に移動するだけです: [[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:myLoadingViewSharedInstance];。また、アクティビティビュー アニメーションを開始することも忘れないでください。
  • [MyLoadingView hide]activityview のアニメーションを停止し、sharedInstanceView を非表示にします。

[MyLoadingView show]別のスレッドで呼び出す必要があることに注意してください。

于 2010-11-03T14:11:05.443 に答える
0

Cocoa での UI の変更は、次にコードが制御を実行ループに戻したときにのみ有効になります。検索タスクがメイン スレッドで同期的に実行されている限り、UI の更新を含め、実行がブロックされます。

時間のかかるタスクをバックグラウンドで非同期に実行する必要があります。これには多くのオプションがあります ( NSOperationperformSelectorInBackground:...、Grand Central Dispatch など)。

于 2010-11-03T14:10:38.950 に答える