0

uitextview が Google API を使用して現在の場所を読み込むときに UIActivityIndi​​catorView を停止する方法。

ここに私のコードがあります:

@implementation ViewController
@synthesize loctxt;

 - (void)viewDidLoad {

        loctxt=[[UITextView alloc]initWithFrame:CGRectMake(10, 50, 220, 30)];
        loctxt.backgroundColor=[UIColor whiteColor];
        loctxt.delegate=self;
        [self.view addSubview:loctxt];

        locbtn=[[UIButton alloc]initWithFrame:CGRectMake(240, 50, 40, 30)];
        [locbtn addTarget:self action:@selector(clickToGetLocation)forControlEvents:UIControlEventTouchUpInside];
        locbtn.backgroundColor=[UIColor grayColor];
        [locbtn setImage:[UIImage imageNamed:@"sst14.gif"] forState:UIControlStateNormal];
        [self.view addSubview:locbtn];

        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }

    - (void)clickToGetLocation {

        spinner = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0,100, 20, 20)];
        [spinner setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray];
        [self.view addSubview:spinner]; 

         **[spinner startAnimating];**


        AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];
        NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%f,%f&output=csv",delegate.latitude, delegate.longitude];

        NSError* error;
        NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error];
        NSLog(@"%@",locationString);

        locationString = [locationString stringByReplacingOccurrencesOfString:@"\"" withString:@""];
        **self.loctxt.text=[locationString substringFromIndex:6];**
    //if i use code [spinner stopanimating]; here then the indicator does not appear    

}
4

2 に答える 2

3

問題は、スピナーを開始し、インターネットからデータをロードしてから、スピナーをすべてメイン スレッド上で、すべて同じメソッド内で停止しようとすることです。メインスレッドで同期ネットワーキングを行うのは悪いことです。

スピナーを起動してから、バックグラウンドでネットワーク アクセスを実行する必要があります。これが完了したら、メイン スレッドでスピナーを停止します。

GCDはこれに非常に適しています。このようなもの:

- (void)clickToGetLocation {
    spinner = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0,100, 20, 20)];
    [spinner setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray];
    [self.view addSubview:spinner]; 
    [spinner startAnimating];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];

        NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%f,%f&output=csv",delegate.latitude, delegate.longitude];

        NSError* error;
        NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error];
        NSLog(@"%@",locationString);

        locationString = [locationString stringByReplacingOccurrencesOfString:@"\"" withString:@""];

        dispatch_async(dispatch_get_main_queue(), ^{
            self.loctxt.text = [locationString substringFromIndex:6];
            [spinner stopAnimating];
        });
    });
}
于 2012-11-25T05:06:55.433 に答える
1

あなたはこれを試すことができますspinner.hidesWhenStopped = YES

于 2012-11-25T06:34:53.207 に答える