ユーザーにビジー/処理の手がかりを表示するために を使用してUIView
いますが、読み込みビューのコンポーネントがユーザーのタッチに反応しません。私の問題を詳しく説明しましょう。約 3UIViewController
秒あり、状況に応じて 1 つView
がVieControllers
表示されます。次のコードを使用して現在のビューを変更します
UIView *currentView = self.view;
UIView *theWindow = [currentView superview];
//Some other code
[currentView removeFromSuperview];
[self.view setFrame: [tileCountViewController.view bounds]];
[theWindow addSubview:tileCountViewController.view];
[theWindow setFrame:[tileCountViewController.view bounds]];
[theWindow setFrame: [[UIScreen mainScreen] bounds]];
次に、一般的にビジー/処理中の UI をユーザーに表示するために使用される Loading ビューがあります。nibファイルから次の方法でLoadingビューを作成しました
- (id)init {
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
NSString *nibName = @"LoadingViewController";
if(UIInterfaceOrientationIsLandscape(orientation)) {
nibName = @"LoadingView-landscape";
}
else {
nibName = @"LoadingView";
}
UINib *nib = [UINib nibWithNibName:nibName bundle:nil];
UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
self = [super initWithFrame:portraitView.frame];
[self addSubview:portraitView];
[self bringSubviewToFront:portraitView];
return self;
}
アプリ デリゲートで、読み込み中のビューを初期化し、メイン ウィンドウに追加します。
if(!loadingViewIndicator){
loadingViewIndicator = [[LoadingView alloc]init];
}
[[[UIApplication sharedApplication]keyWindow]addSubview:loadingViewIndicator];
loadingViewIndicator.hidden = YES;
ローディング/ビジービューを表示する必要があるときはいつでも、このようにロードするだけです
[loadingViewIndicator performSelectorOnMainThread:@selector(startLoadingViewIndicator:) withObject:startMsg waitUntilDone:NO];
- (void)startLoadingViewIndicator:(NSString *)startMsg{
self.hidden = NO;
[self.superview bringSubviewToFront:self];
[self.activityIndicator startAnimating];
[self.loadingMessage setText:startMsg];
self.loadingProgressView.progress = 0.0f;
[self refreshPosition];
}
すべて正常に動作しますが、読み込みビューのコンポーネントがタッチに反応しません。何がうまくいかないのですか?
問題はスレッドの問題によるものであることに気付きました。ユーザーがファイルのダウンロードを開始すると、このサブビューが表示されます。私の以前のコードは、ダウンロードを直接開始することでした
urlconnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately: YES];
以下のように、バックグラウンドスレッドを使用して別のメソッドからこのメソッドを呼び出しています
[self performSelectorInBackground:@selector(startDownload) withObject:nil];
そして、次のようにダウンロードにrunloopを追加しています
urlconnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately: YES];
CFRunLoopRun();
これは正常に機能し、私のサブビューは応答性があります。本当に時間がかかりました。問題は、バックグラウンド スレッドでダウンロードを実行し、同時に UI をレスポンシブにするのに役立つ明確なコード例があることです。