presentModalViewController: не возвращает - PullRequest
1 голос
/ 15 апреля 2011

У меня действительно странная вещь.В моем делегате приложения я вызываю presentModalViewController: для UITabBarController для отображения пользовательского класса (LoadingViewController), который реализует loadView для отображения изображения.Когда я проверяю это в симуляторе на устройстве iOS 4.x (iPhone или iPad), он отлично работает во всех направлениях.Тем не менее, когда я тестирую на iPad с версией 3.2, он работает нормально только при книжной ориентации.Если это альбомная ориентация, presentModalViewController: метод не возвращается.Методы loadView и viewDidLoad вызывают, но методы viewWillAppear: и viewDidAppear: не вызывают.

Есть идеи?

Вот код для loadView в LoadingViewController:

- (void) loadView
{
    CGRect mainScreenBounds = [UIScreen mainScreen].bounds;

    UIImageView * loadingImageView = [[UIImageView alloc] initWithFrame: mainScreenBounds];

    loadingImageView.autoresizesSubviews = YES;
    loadingImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    NSString * splashImageName = [self getSplashImageName: [UIDevice currentDevice].orientation];
    loadingImageView.image = [UIImage imageNamed: splashImageName];

    UIActivityIndicatorView * spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge];
    CGRect spinnerFrame = spinner.frame;

    spinnerFrame.origin.x = (mainScreenBounds.size.width - spinnerFrame.size.width) / 2;
    spinnerFrame.origin.y = mainScreenBounds.size.height * 0.7f;

    spinner.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin
                             | UIViewAutoresizingFlexibleRightMargin
                             | UIViewAutoresizingFlexibleTopMargin
                             | UIViewAutoresizingFlexibleBottomMargin;
    spinner.frame = spinnerFrame;
    spinner.hidesWhenStopped = YES;

    [spinner startAnimating];

    [loadingImageView addSubview: spinner];

    // Add a label indicating we are working so the user knows what we are doing.
    UIColor * textColor = [UIColor blueColor];

    CGRect labelFrame = loadingImageView.frame;
    labelFrame.size.height = 40;
    labelFrame.origin.y = spinnerFrame.origin.y - 100;
    UILabel * workingLabel = [[UILabel alloc] initWithFrame: labelFrame];
    workingLabel.font             = [UIFont systemFontOfSize: 18.0];
    workingLabel.textColor        = textColor;
    workingLabel.backgroundColor  = [UIColor clearColor];
    workingLabel.textAlignment    = UITextAlignmentCenter;
    workingLabel.text             = NSLocalizedString(@"Searching for location...", @"Searching for location...");
    workingLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin
                                  | UIViewAutoresizingFlexibleRightMargin
                                  | UIViewAutoresizingFlexibleTopMargin
                                  | UIViewAutoresizingFlexibleBottomMargin
                                  | UIViewAutoresizingFlexibleWidth
                                  | UIViewAutoresizingFlexibleHeight;

    [loadingImageView addSubview: workingLabel];
    [workingLabel release];

    [spinner release];

    self.view = loadingImageView;
    [loadingImageView release];
}

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Решение, которое мы получили, заключается в том, чтобы вообще не использовать presentModalViewController, а установить LoadingViewController в качестве корневого контроллера представления.Очевидно, что это не полное решение, но, к счастью, оно было достаточно хорошим для нас.Что расстраивает, так это то, что вы не знаете, почему presentModalViewController не работает сейчас, когда он работал нормально в предыдущей версии нашего приложения.Что-то, что мы сделали, сломало это.

0 голосов
/ 28 апреля 2011

UITabBarController должен быть RootViewController при использовании presentModalViewController. Также существует проблема с IOS 3.2, что при использовании presentModalViewController в ландшафте с UITabBarController, если все его контроллеры вида не переопределяют shouldAutorotateToInterfaceOrientation и возвращают yes для ландшафта, этоприведет к зависанию presentModalViewController.

...