1

右側のアクセサリ ビューとしてボタンを持つ注釈付きの mapView があります。注釈の詳細が表示されたらすぐにボタンを押すと、必要な情報をダウンロードするのに十分な時間がなかったため、詳細が空に見えます。私が求めているのは、その情報がダウンロードされている限り、アクティビティ インジケーターを表示することです。これが私が今まで持っているものです:

-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation{

popButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 31, 31)];
[popButton addTarget:self action:@selector(button:) forControlEvents:UIControlEventTouchUpInside];
activityI = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 31, 31)];
[activityI startAnimating];
[popButton addSubview:activityI];
[NSThread detachNewThreadSelector:@selector(threadInfo:) toTarget:self withObject:annotation];
.
.
.
annView.rightCalloutAccessoryView = popButton;
}

-(void) threadInfo: (MKAnnotationView*) info{

while ([activityI isAnimating]) {
    if (ok ==0) {

    }
    else{

        NSLog(@"ok = %i",ok);
        popButton = (UIButton*) info.rightCalloutAccessoryView; <--error*
        popButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
        [activityI removeFromSuperview];
        [activityI stopAnimating];
        ok=0;
        }
    }

}

ここで、「ok」 = 整数、1 = ダウンロード プロセスが正常に完了したとき

エラー = キャッチされない例外 'NSInvalidArgumentException' によるアプリの終了、理由: '-["注釈クラス名" rightCalloutAccessoryView]: 認識されないセレクターがインスタンス 0x17e7fc60 に送信されました'

ボタンをコメントアウトしても、アクティビティはクラッシュせずにアニメーション化されます..

更新:(コメントアウトされたものはすべてテストされ、機能していません-必ずしも同時にではありません。コメントされていないものはすべて私の最後の試みでした)...

-(void) threadInfo: (MKAnnotationView*) annView{
UIButton* popButtons = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 31, 31)];
act = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 31, 31)];
[act setColor:[UIColor greenColor]];
[act startAnimating];
[popButtons addSubview:act];
while ([act isAnimating]) {
            if (ok ==0) {
        NSLog(@"ok = %i",ok);

    }
    else{

        NSLog(@"ok = %i",ok);

      // popButton = (UIButton*) annView.rightCalloutAccessoryView;
//UIButton* popButtons = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 31, 31)];
        popButtons = [UIButton buttonWithType:UIButtonTypeInfoLight];
       // UIActivityIndicatorView *currentActivityIndicator = (UIActivityIndicatorView *)[popButton viewWithTag:15];
        //currentActivityIndicator.hidden = YES;
        //[popButtons addSubview:[(UIActivityIndicatorView*) [popButton viewWithTag:15]]];
//            [(UIActivityIndicatorView *) [popButton viewWithTag:15] stopAnimating];
//            [(UIActivityIndicatorView *) [popButton viewWithTag:15] removeFromSuperview];
        annView.rightCalloutAccessoryView = popButtons;
        //[popButton addSubview:popButtons];
      //  NSLog(@"view = %@",[popButton viewWithTag:15]);
        //[act stopAnimating];

//            [currentActivityIndicator stopAnimating];
//            [currentActivityIndicator removeFromSuperview];

      //  popButton = [UIButton buttonWithType:UIButtonTypeInfoLight];

    //ok=0;
}
}

}
4

1 に答える 1

0

で使用activityIしてthreadInfoいるものは、使用されているannotationViewに添付されているもの(info変数)であるとは限りません。viewForAnnotationこれは、任意の注釈に対していつでも呼び出すことができる呼び出しによって作成された最後のものです。on のアクティビティ インジケータを取得する必要がありますinfo。ここにいくつかの疑似コードがあります。accessoriesView を取得してから、追加したアクティビティ インジケーターであるサブビューを取得します。viewForAnnotation

popButton = (UIButton*) info.rightCalloutAccessoryView;
UIActivityIndicator *currentActivityIndicator = (UIActivityIndicator *)[popButton **Get the right subview here**];

別のオプションは、accessoryview を情報ボタンに直接設定することです。

info.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeInfoLight];

popButton を rightCalloutAccessoryView に向けてから、それを新しいボタンに向けていましたが、それは rightCalloutAccessoryView を変更しません

于 2013-02-26T20:52:53.577 に答える