2

このコードを使用して多くのPDFファイルをダウンロードしています

for (int i=0; i<[myBooks count]; i++) {

Book_own *temp= (Book_own *)[myBooks objectAtIndex:i]; // myBooks is a mutable array of object Book_own

     // to download pdf
     NSString *documentName = [temp.bo_path stringByDeletingPathExtension];

     NSString *pdfLink = [NSString stringWithFormat:@"http://url.com/files/%@",temp.bo_path];

     NSString *linkWithoutSpaces = [pdfLink stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

     NSString *urlString = linkWithoutSpaces;

     NSURL *url = [NSURL URLWithString:urlString];

     NSData *data = [NSData dataWithContentsOfURL:url];

     NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

     NSString *documentDir = [documentPaths objectAtIndex:0];

     NSLog(@"in settings, Document Directory: %@",documentDir);

     NSString *pdfPath = [NSString stringWithFormat:@"%@/%@",documentDir,[NSString stringWithFormat:@"%@.pdf",documentName]];

      NSLog(@"pdfpath: %@",pdfPath);

      [data writeToFile:pdfPath atomically:YES];
      NSData *tmp = [NSData dataWithContentsOfURL:url];

      if (tmp != nil) {
         NSError *error = nil;
         [tmp writeToFile:pdfPath options:NSDataWritingAtomic error:&error];
         if (error != nil) {
            NSLog(@"Failed to save the file: %@", [error description]);
             } else {
               NSLog(@"downloaded");
             }
           } else {
               NSLog(@"fail to save pdf file");
              }
 }

これは私のためにファイルをダウンロードしますが、それは私を長い間待たせます、そして私はダウンロードの進行状況を私に示すためにactivityIndi​​catorまたはプログレスバーを追加したいと思います。しかし、私はiPhoneを初めて使用するので、これを行う方法がわかりません。誰かが私を助けることができますか?

4

5 に答える 5

2

アクティビティインジケーターには多くのカスタムクラスがあります。iphoneを初めて使用するため、xcodeのデフォルトのアクティビティインジケーターをお勧めします。

1)UIActivityIndi​​catorオブジェクトをInterfaceBuilderにドラッグアンドドロップします。

ビューコントローラの.hファイルに次のコードを記述します。

    IBOutlet  UIActivityIndicator *activityIndicator;
    //connect this outlet to the xib.

.mファイル内:

       //when u call the method
      [activityIndicator startanimating];
      //when everything is complete
      [activityIndicator stopanimating];

これがあなたがそれを始めるのに役立つことを願っています。

于 2012-12-01T11:54:32.370 に答える
1

良い例を見つけました

.hファイル内

UIAlertView *progressAlert;

.mファイル内

-(void)showAlertMethod

{
 progressAlert = [[UIAlertView alloc] initWithTitle:@"Uploading please wait...\n" message:@"" delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
CGRect alertFrame = progressAlert.frame;
UIActivityIndicatorView* activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicator.frame = CGRectMake(135,alertFrame.size.height+55, alertFrame.size.width,30);
activityIndicator.hidden = NO;
activityIndicator.contentMode = UIViewContentModeCenter;
[activityIndicator startAnimating]; 
[progressAlert addSubview:activityIndicator];
[progressAlert show];

}
-(void)dismissAlertMethod
{
[progressAlert dismissWithClickedButtonIndex:0 animated:YES];
}

要件に応じてメソッドを呼び出します。私はこのようにメソッドを呼び出します:-

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

[NSThread detachNewThreadSelector:@selector(dismissAlertMethod) toTarget:self withObject:nil];
于 2012-12-01T22:12:31.143 に答える
0
You can use below function for depicting indicator, which is added on a view:(showing indicator at amid of screen)

-(void)showActivityIndicatorViewer
{
    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    UIWindow *window = delegate.window;
    activityView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, window.bounds.size.width, window.bounds.size.height)];
    activityView.backgroundColor = [UIColor blackColor];
    activityView.alpha = 0.5;

    UIActivityIndicatorView *activityWheel = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(window.bounds.size.width / 2 - 12, window.bounds.size.height / 2 - 12, 24, 24)];
    activityWheel.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
    activityWheel.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleTopMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);
    [activityView addSubview:activityWheel];
    [window addSubview: activityView];

    [[[activityView subviews] objectAtIndex:0] startAnimating];
}

-(void)hideActivityIndicatorViewer
{
    [[[activityView subviews] objectAtIndex:0] stopAnimating];
    [activityView removeFromSuperview];
    activityView = nil;
}

While, if you just want default(shown at top of status bar):

Also, you can third party like HUD, you just google it, you'll find how yo use it.
于 2012-12-01T11:52:18.283 に答える
0

MBProgressuHUDは、アクティビティインジケーターを表示するための非常に優れた使いやすいドロップインクラスです。

また、ファイルを非同期でダウンロードする必要があります。デモプロジェクトでは、NSURLConnectionとGCDのいくつかの異なる例があると思います。

于 2012-12-01T11:47:19.353 に答える
0
  1. 2番目のスレッドにオフロードします。

    [self performSelectorInBackground:@selector(downloadAll)];
    
  2. ダウンロード前にインジケーターUIを表示する

    //MOCKUP UI
    indicator = [[UIActivityIndicator alloc] initWithFrame:CGRectMake(10,10,50,50)];
    self.view addSubView:indicator];
    [indicator startAnimating];
    
    [self performSelectorInBackground:@selector(downloadAll)];
    
  3. コールバックメインスレッドをダウンロードした後

    - (void)downloadAll {
        //...... YOUR DOWNLOAD CODE
        [self performSelectorOnMainThread:@selector(downloadDone) waitUntilDone:NO];
    }
    
  4. ダウンロードで完了インジケーターを非表示

    - (void)downloadDone {
        [self.indicator stopAnimating];
        [self.indicator removeFromSuperview];
    }
    
于 2012-12-01T11:54:46.970 に答える