6

iPhoneアプリで、検索バーの上にアクティビティインジケーターを追加したいと思います。

検索中は、アクティビティインジケーターが表示されます。

XIBにアクティビティインジケーターを追加し、そのアウトレットを作成しました。

検索が終了すると非表示にしますが、アクティビティインジケーターが表示されません。

問題

検索関数(たとえばA)(アクティビティインジケーターをアニメーション化する)が別の関数(たとえばB)を呼び出すため、関数Bの実行にメインスレッドが使用されていることがわかりました。ただし、アクティビティインジケーターをアニメーション化するには、メインスレッドが必要です。スレッド。

performSelectorInBackGround:withObjectそこで、メソッドを使って関数Bを呼び出してみました。検索をクリックすると、アクティビティインジケーターが表示されますが、機能Bの機能は実行されません。

これの回避策は何ですか?

4

8 に答える 8

1

あなたの質問には先に進むのに十分ではありませんが、デバッグを開始するには、次のことを行います。

  1. アクティビティが実際にIBで作成しているUIActivityIndi​​catorに接続されていることを確認します。(setHidden:行にブレークポイントを設定し、変数がnullでないことを確認します。または、そこにNSAssert(activity、@ "Whoops!actity is null");をスローします。)

  2. 変数が実際に設定されている場合は、ビュー階層の正しい場所にあることを確認し始めます。([self.view addSubview:activity]を実行してみて、表示されることを確認します。別の場所で置き換える必要がある場合があります。)

  3. すべてが理解できるまで、IBでデフォルトでオンにしてみることもできます。

幸運を。お役に立てれば。

于 2010-12-11T07:33:03.203 に答える
1

カスタムアクティビティインジケーターを作成する手間を省き、トップバーですでに利用可能な標準のインジケーターを使用します。また、IMOユーザーは、何かが起こっているときにスピンすることを期待する傾向があります。

UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES; 

もちろん、アクティビティが終わったらNOに設定してください。

于 2011-01-13T12:35:41.880 に答える
0

まず、.mファイルの先頭に@synthesizeアクティビティがあることを確認します。次に、viewDidLoadメソッドに。と入力しactivity.hidesWhenStopped = TRUE;ます。次に、検索開始時に呼び出されるメソッドに、検索停止時にメソッドに[activity startAnimating];とを入力します。[activity stopAnimating];

于 2010-12-11T18:26:47.650 に答える
0

これを試して:

を設定hidesWhenStopped = NOすると、常に表示され、手動で非表示および表示されます。ただし、ビューは最初に非表示に設定する必要があります。

- (void)startActivityView {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    activity_view.hidden = NO;
    [pool drain];
}

- (void)stopActivityView {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    activity_view.hidden = YES;
    [pool drain];
}

- (void)doSomething {
    [self performSelectorInBackground:@selector(startActivityView) withObject:nil];
    // do some time consuming work
    [self performSelectorInBackground:@selector(stopActivityView) withObject:nil];
}
于 2010-12-18T19:44:01.263 に答える
0

おそらく、アクティビティインジケーターの前にビューがありますか?いつも前に持ってきたらどうなる…。

loadView = [[UIActivityIndicatorView alloc] 
            initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
loadView.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
loadView.center = window.center;
loadView.opaque = NO;
[window addSubview: loadView];
[window bringSubviewToFront:loadView];
[loadView startAnimating];
于 2011-01-30T09:13:07.700 に答える
0

DSActivityViewアクティビティインジケーターを表示するために使用することをお勧めします。ソースコードはDejalブログにあります。

アクティビティビューの表示と非表示は、単純なコード行です。

[DSActivityView activityViewForView:self.view];

于 2011-01-31T03:14:48.290 に答える
0

アクティビティインジケーターのアニメーションを開始し、0.1または0.2の遅延で、必要な他のメソッドを呼び出すだけです。試してみましたが、機能しています。

于 2011-02-02T10:27:40.727 に答える
0

私は解決策を手に入れました、そしてそれは次の通りです。

検索ボタンクリックイベントに以下の行を書きました。

[NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];

そして、関数threadStartAnimating:を次のように定義しました。

-(void)threadStartAnimating:(id)data
{
   [activityIndicator setHidden:NO];
   [activityIndicator startAnimating]; 
}
于 2011-02-03T12:17:24.530 に答える