Подвид, общий для нескольких контроллеров представления, не отвечает
Я использую UIView
чтобы показать занятость / обработку ключа для пользователя, и компоненты в представлении загрузки не отвечают на прикосновения пользователя. Позвольте мне уточнить мою проблему. У меня около 3 UIViewController
с и в зависимости от ситуации один 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]];
Затем у меня появляется представление "Загрузка", которое обычно используется для отображения пользовательского интерфейса "занят / обработка". Я создал представление загрузки следующим образом из файла пера
- (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();
Это прекрасно работает, и мое подпредставление отзывчиво. Это действительно заняло много времени. Проблема в том, что существует четкий пример кода, который поможет запустить загрузку в фоновом потоке и в то же время сделать интерфейс отзывчивым.