2

イベントをTableViewControllerトリガーするボタンがあり、[NSURLConnection sendAsynchronousRequest...]performSegueWithIdentifier:sender:を介してモーダルセグエをロードします。これは小さなビューコントローラーを対象としています。このオーバーレイビューコントローラの目的は、読み込み中のグラフィックを表示し、データがを介して送信されている間のユーザーの操作を防ぐことNSURLConnectionです。

の完了ブロックで、 (バッチリストのみ)NSURLConnectionのデータを削除するメソッドを呼び出してから、オーバーレイビューコントローラーを呼び出します。TableViewControllerdismissViewControllerAnimated:completion:

「警告:プレゼンテーションまたは却下の進行中にView Controllerを却下しようとしています!」という警告をデバッガーにスローするオーバーレイViewControllerを却下することを除いてすべてが機能します 。

このエラー、特にメソッドの使用に関するさまざまな質問と回答を見つけましperformSelector:object:withDelayたが、これまでのところ何も機能していません。

これは、アプリの別の領域で同様のプロセスを使用しているため、特に厄介です。ただし、dismissViewControllerは、の選択から呼び出され、UITableViewCellこれは正常に機能します...

私のコードの関連する部分を以下に示します。

#import "ViewBatch.h"

@interface ViewBatch ()
@property (strong, nonatomic) LoadingOverlayViewController *loadingOverlay;
@end

@implementation ViewBatch
@synthesize loadingOverlay;

....

- (IBAction)exportBatch:(id)sender
{
    if ([productArray count] > 0) {
        [self performSegueWithIdentifier:@"loadingSegue" sender:self];
        [self processData];
    }
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"loadingSegue"]) {

        loadingOverlay = segue.destinationViewController;
    }
}

- (void)processData
{

    // Code to create a file and NSURLRequest...
    // ....

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:urlRequest
                                       queue:queue
                           completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
                               if ([responseData length] > 0 && error == nil)
                               {
                                   // Not used for this request yet...
                               }
                               else if ([responseData length] == 0 && error == nil)
                               {
                                   // Success...
                                   [self didSendData];
                               }
                               else if (error != nil)
                               {
                                   // Connection error...
                                   NSLog(@"Error: %@", error);
                               }
                          }];
}

- (void)didSendData
{
    // Reset the batch...

    [productArray removeAllObjects];
    [self.tableView reloadData];

    [loadingOverlay dismissViewControllerAnimated:YES completion:NULL];
}

そして、ロードビューコントローラは次のとおりです。

#import <UIKit/UIKit.h>

@interface LoadingOverlayViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

@end

....

....

#import "LoadingOverlayViewController.h"

@interface LoadingOverlayViewController ()
@end

@implementation LoadingOverlayViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.activityIndicator startAnimating];
}

@end
4

3 に答える 3

1

問題の正確な原因についてはわかりませんが、コードに関するいくつかの所見を以下に示します。

  • ユーザーの操作を防ぐためにオーバーレイは必要ありません。-NSApplicationbeginIgnoringInteractionEventsとのユーザーインタラクションをオフにするだけです。

  • オーバーレイビューを表示するために、ViewController全体は必要ありません。ビューを表示するだけです。たとえば、NSURLConnectionが発生している間、ビューの中央に大きなUIActivityIndi​​catorViewを配置することがよくあります。

  • NSURLConnectionを非同期で使用するために、NSOperationQueueは必要ありません。すでに非同期です。NSURLConnectionを作成し、デリゲートメッセージが到着するのを待つだけです。現状では、セカンダリキューを設定し、メッセージがそのキューに到着し、テーブルdidSendDataを呼び出すreloadDataバックグラウンドで呼び出しを行うため、自分自身を混乱させています。これは違法です。これを通常の方法で行った場合、デリゲートメッセージはメインスレッドに到着します。これはまさにあなたが望むものです。

于 2012-11-14T05:23:37.987 に答える
0

私もこの問題を抱えていました。これは、nibファイルにボタンをコピーして貼り付けた結果であることに気付きました。この結果、IBActionsは2つの1UIButtonを結び付ける必要がありました。

于 2013-01-11T16:14:50.653 に答える
0

気にしないでください、私はそれがうまくいった。30分の休憩が自分の考えを整理するために何ができるか驚くべきこと...

プロセスは終了し、実際のビューのロードが完了する前にdismissViewControllerを呼び出していました。オーバーレイのviewDidLoadからの単純なデリゲート呼び出しは、物事を整理しました。

于 2012-11-14T05:20:39.123 に答える