0

iOS でアクティビティ インジケーターを使用しようとしていますが、使用できません。私は Stackoverflow のスレッドに従い、そのように使用しました。これは私が書いたものです:

-(void)viewDidLoad
{
    [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:self];

    UITapGestureRecognizer *tGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doThisForTap:)];
    tGR.numberOfTapsRequired = 1;

    [myRollTypeLabel addGestureRecognizer:tGR];
    myRollTypeLabel.userInteractionEnabled = YES;

    [self.scrollView addSubview:myRollTypeLabel];
}

- (void) threadStartAnimating:(id)data
 {
self.activityIndicatorNew =[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
self.activityIndicatorNew.color = [UIColor redColor];
[self.activityIndicatorNew startAnimating];
 }
- (void)doThisForTap :(UIGestureRecognizer *)gest
{
  //lots of computation.
}
- (void)viewWillDisappear:(BOOL)animated
{
[self.activityIndicatorNew stopAnimating];
self.activityIndicatorNew.hidden = YES;
}

しかし、アクティビティインジケーターがまったく表示されませんか? メソッド「doThisForTap」では、計算を行い、別の UIViewController に移動します。しかし、アクティビティインジケーターが表示されません。私は何を間違っていますか?さらに情報が必要な場合は、お問い合わせください。ありがとう..

4

1 に答える 1

1

addSubview を使用して、実際にインジケーターをビュー階層に追加しているようには見えません。

それをインスタンス化し、プロパティに割り当て、アニメーション化を開始していますが、実際にビュー階層に追加することはありません(私が見る限り)。

画面にアクティビティ インジケーターを追加するには、その起点を設定してから、それを表示するビューに追加する必要があります。

self.activityIndicatorNew =[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
self.activityIndicatorNew.color = [UIColor redColor];

CGRect indicatorFrame = self.activityIndicatorNew.frame;
indicatorFrame.origin.x = // x coordinate goes here;
indicatorFrame.origin.y = // y coordinate goes here;
self.activityIndicatorNew.frame = indicatorFrame;

[self.view addSubview:self.activityIndicatorNew];

[self.activityIndicatorNew startAnimating];

メインスレッド以外からビュー階層を操作することは想定されていないため、上記のほとんどをバックグラウンドスレッドで実行しないでください。

バックグラウンド スレッドでインジケーターのアニメーションを開始する必要がある場合 (ここで示したコードから完全に確信できるわけではありません)、そのバックグラウンド スレッドで安全に実行できる唯一の方法は、startAnimating を呼び出すことです。新しいスレッドをデタッチする前に、その他すべてを viewDidLoad に入れる必要があります。

ただし、最初に viewDidLoad ですべてを実行し、絶対に必要な場合にのみバックグラウンド スレッドを使用します。

個人的には、これには Interface Builder を使用します。コードで単純なアクティビティ インジケーターをインスタンス化する理由はあまり思いつきません。

于 2013-01-17T22:37:18.607 に答える