target-c modalViewController слишком быстрый - PullRequest
0 голосов
/ 15 июля 2011

У меня проблема с отклонением модального контроллера вида в определенном пограничном случае.Я отображаю модальное представление, когда извлекаю PDF для отображения в UIWebView.Когда файл, который я получаю, очень маленький, модальное представление попытается закрыть слишком рано.Я представляю модальное представление в контроллере представления, который содержит UIWebView.Я отклонил это в методе делегата didFinishLoad UIWebView.

Я в порядке, не анимируя первоначальное представление модального представления ... но разве это безопаснее, чем то, что я делал?есть ли у этого потенциал на провал, и если да, то как бы вы изменили его?Я просматривал документы, и ничего, что я до сих пор читал, не решает эту ситуацию.

//
// This will download the file if not @ specific path, otherwise use local file.
// _myFileManager is a helper class and _myFileRecord is the backing data model
//
-(id)initWithNib... fileRecord:(MYFileRecord *)_myFileRecord
{
    [_myFileManager cacheFileAsync:_myFileRecord delegate:self];
}

- (void)viewDidLoad 
{
    // doesn't seem to work, NO for animated does seem to work
    [self.navigationController presentModalViewController:_splashController 
                                                 animated:YES];        
    _splashController.messageLabel.text = @"Retrieving File...";
}

- (void)recordSaved:(MyFileRecord *)myFileRecord fileName:(NSString *)fileName
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:fileName]];
    [_webView loadRequest:request];
}

- (void)webViewDidStartLoad:(UIWebView *)webView {
    _splashController.messageLabel.text = @"Opening File...";
}

//
// This fails when a small file is already cached to disk and the time
// for the webView to finishLoad is faster than the splashView can present itself
//
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.navigationController dismissModalViewControllerAnimated:YES];
}

Ответы [ 3 ]

1 голос
/ 15 июля 2011

Попробуйте реализовать viewDidAppear в вашем SplashController, чтобы поймать, когда представление закончило анимацию, и установить флаг.Затем вы можете контролировать, закончилась ли загрузка представления SplashController, используя этот флаг, и ждать его, если он еще не завершен?

Например

-(void)viewDidAppear {
  if (shouldDismiss) {
    [self dismissViewControllerAnimated:YES];
  }
  readyToDismiss = YES;
}

А в вашем главном VC:

-(void)webViewDidFinishLoading:(UIWebView*)webViewv
{
  if (_splashController.readyToDismiss) {
    [_splashController dismissViewControllerAnimated:YES];
  } else {
    _splashController.shouldDismiss = YES; // will dismiss in viewDidAppear
  }
}
1 голос
/ 15 июля 2011

Вы можете попробовать проверить, завершил ли splashView, и использовать performSelector:afterDelay:, чтобы проверить позже.

Моя идея состоит в том, чтобы создать такой метод

-(void)dismissWhenReady {
    if ( splashView is finished) {
        [self.navigationController dismissModalViewControllerAnimated:YES];
    } else 
        [self performSelector:@selector(dismissWhenReady) afterDelay:1.0];
    }
}
0 голосов
/ 15 июля 2011

viewDidLoad срабатывает слишком рано (до его отображения), вам нужно будет использовать -(void)viewDidAppear:(BOOL)animated, чтобы вместо этого представить свой модальный вид вместе с флагом, чтобы узнать, является ли это первой загрузкой. Если он по-прежнему не отображается достаточно долго, добавьте задержку на желаемый промежуток времени.

...